Domanda

Vorrei codificare un proxy che inoltra le chiamate di metodi di un altro oggetto su TCP senza roba e NSConnection NSDistanceObject. Quello che voglio è il mio proprio protocollo.

Il problema è che sottoclassi NSProxy e prioritario forwardInvocation: non è sufficiente. Devo anche ignorare methodSignatureForSelector

Ecco la mia domanda:

– (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    return ??? 
}
È stato utile?

Soluzione 3

Ho trovato un intelligente soluzione per generare oggetti NSInvocation.

Altri suggerimenti

@ Brian, questo può essere ok, ma setProtocolForProxy: è solo per l'ottimizzazione. cocoafan potrebbe mandato per la sua soluzione, ma non sarebbe un rimpiazzo. Dovresti essere in grado di ottenere automaticamente le firme. Per fare questo, il protocollo di rete ha bisogno di un modo per richiedere la firma.

Credo che la soluzione è quella di includere nel protocollo di rete un metodo di "richiesta di firma del metodo", e lo hanno eseguito methodSignatureForSelector: sul oggetto distante e codificare e restituire il risultato. Questo è quello che fa NSDistantObject.

Fornire setProtocolForProxy: è un'ottimizzazione importante se si sta andando a chiacchierare molto, ma lo fa si limitano agli oggetti che avete un protocollo per, e prima di 10.5, che introduce alcune limitazioni fastidiose (tutti i metodi sono necessari). Anche su 10.5, può introdurre alcune limitazioni problematici se è l'unico modo per ottenere le firme dei metodi.

@cocoafan, penso che probabilmente hai ragione per creare questa da zero sopra NSProxy, ma fanno dare un'occhiata a NSConnection e vedere se è possibile sotto-classe di gestire la connessione di rete nel modo desiderato. Se si riesce a trovare un modo per farlo (anche se non vedo un modo semplice destra fuori), probabilmente otterrete un sacco di roba gratuitamente dal NSDistantObject.

Il NSDistantObject modo gestisce questa è dal suo processo setProtocolForProxy:, che specifica un protocollo contenente l'elenco dei metodi che l'oggetto sull'altra estremità della connessione maniglie. Si può quindi utilizzare le informazioni per questi metodi per fornire adeguati oggetti NSMethodSignature quando si fa l'inoltro.

Sembra che il più semplice per farlo è tramite la funzione protocol_getMethodDescription(), ha dichiarato in <objc/runtime.h>. Ciò restituisce uno struct objc_method_description che contiene un campo types. Credo che si dovrebbe essere in grado di passare quel valore in +[NSMethodSignature signatureWithObjCTypes:] per ottenere un oggetto metodo di firma che corrisponde a ciò che ha dichiarato nel protocollo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top