2009-06-01 5 views
5

Vorrei codificare un proxy che inoltra i richiami dei metodi a un altro oggetto tramite TCP senzaNSConnection e NSDistanceObject. Quello che voglio è il mio protocollo.Utilizzo di NSProxy e forwardInvocation:

Il problema è che la sottoclasse di NSProxy e l'override di forwardInvocation: non sono sufficienti. Devo anche ignorare methodSignatureForSelector

Ecco la mia domanda:

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

risposta

1

Il modo NSDistantObject gestisce questo è dal suo processo setProtocolForProxy:, che specifica un protocollo contenente l'elenco dei metodi che l'oggetto all'altro capo del la connessione gestisce. Può quindi utilizzare le informazioni per questi metodi per fornire gli oggetti NSMethodSignature appropriati durante l'inoltro.

Sembra che il modo più semplice per farlo sia tramite la funzione protocol_getMethodDescription(), dichiarata in <objc/runtime.h>. Ciò restituisce una struttura objc_method_description che contiene un campo types. Credo che dovresti essere in grado di passare tale valore in +[NSMethodSignature signatureWithObjCTypes:] per ottenere un oggetto firma del metodo che corrisponda a quanto dichiarato nel protocollo.

2

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

Credo che la soluzione qui sia includere nel protocollo di rete un metodo "firma del metodo di richiesta" e farlo eseguire methodSignatureForSelector: sull'oggetto distante e codificare e restituire il risultato. Questo è ciò che fa NSDistantObject.

Fornire setProtocolForProxy: è un'importante ottimizzazione se chiacchierai molto, ma ti limita agli oggetti per i quali disponi di un protocollo e prima del 10.5 che introduce alcune fastidiose limitazioni (sono richiesti tutti i metodi). Anche a 10.5, potrebbe introdurre alcune limitazioni problematiche se è l'unico modo per ottenere le firme dei metodi.

@cocoafan, penso che probabilmente hai ragione di crearlo da zero sopra NSProxy, ma dai un'occhiata a NSConnection e vedi se riesci a sottoclassarlo per gestire la connessione di rete nel modo desiderato. Se riesci a trovare un modo per farlo (anche se non vedo subito un modo facile), probabilmente riceverai molte cose gratuitamente da NSDistantObject.

+0

Consiglio preso, grazie a tutti e due. Sostituirò la comunicazione con XML-RPC. Non sono sicuro che ciò sia possibile sostituendo NSConnection. – cocoafan