2009-06-01 17 views
5

Me gustaría codificar un proxy que reenvía invocaciones de método a otro objeto a través de TCP sinNSConnection y NSDistanceObject cosas. Lo que quiero es mi propio protocolo.Usando NSProxy y forwardInvocation:

El problema es que la subclase de NSProxy y la anulación de forwardInvocation: no es suficiente. También tengo que anular methodSignatureForSelector

Aquí está mi pregunta: ¿

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

Respuesta

1

La forma NSDistantObject maneja esto es por su método setProtocolForProxy:, que especifica un protocolo que contiene la lista de los métodos que el objeto en el otro extremo del la conexión maneja. A continuación, puede utilizar la información de estos métodos para proporcionar los objetos NSMethodSignature apropiados al hacer el reenvío.

Parece que lo más sencillo es hacerlo a través de la función protocol_getMethodDescription(), declarada en <objc/runtime.h>. Esto devuelve una estructura objc_method_description que contiene un campo types. Creo que debería poder pasar ese valor al +[NSMethodSignature signatureWithObjCTypes:] para obtener un objeto de firma de método que coincida con lo declarado en el protocolo.

2

@Brian, Esto puede estar bien, pero setProtocolForProxy: es solo para la optimización. cocoafan podría ordenar su solución, pero no sería un reemplazo inmediato. Se supone que debes poder obtener las firmas automáticamente. Para hacer eso, el protocolo de red necesita una forma de solicitar la firma.

Creo que la solución aquí es incluir en el protocolo de red un método de "firma de método de solicitud", y ejecutarlo methodSignatureForSelector: en el objeto distante y codificar y devolver el resultado. Eso es lo que hace NSDistantObject.

Proporcionar setProtocolForProxy: es una optimización importante si va a parlotear mucho, pero lo restringe a objetos para los que tiene un protocolo, y antes de 10.5 que presenta algunas limitaciones molestas (se requieren todos los métodos). Incluso en 10.5, puede presentar algunas limitaciones problemáticas si es la única forma de obtener firmas de métodos.

@cocoafan, creo que es probable que tenga razón para crear esto desde cero en la parte superior de NSProxy, pero eche un vistazo a NSConnection y vea si puede subclase para administrar la conexión de red de la manera que desee. Si puede encontrar una manera de hacerlo (aunque no veo una manera fácil de hacerlo), probablemente obtendrá muchas cosas gratis en NSDistantObject.

+0

Consejo tomado, gracias a los dos. Reemplazaré la comunicación con XML-RPC. No estoy seguro si esto es posible anulando NSConnection. – cocoafan