Использование NSProxy и forwardInvocation: - PullRequest
5 голосов
/ 02 июня 2009

Я хотел бы закодировать прокси-сервер, который перенаправляет вызовы методов другому объекту по TCP без NSConnection и NSDistanceObject. Что я хочу, так это мой собственный протокол.

Проблема в том, что подкласса NSProxy и переопределения forwardInvocation: недостаточно. Я также должен переопределить methodSignatureForSelector

Вот мой вопрос:

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

Ответы [ 3 ]

2 голосов
/ 02 июня 2009

@ Брайан, это может быть хорошо, но setProtocolForProxy: только для оптимизации. cocoafan мог бы поручить это для своего решения, но это не будет заменой. Вы должны иметь возможность получать подписи автоматически. Для этого в сетевом протоколе необходим способ запроса подписи.

Я полагаю, что решение здесь состоит в том, чтобы включить в сетевой протокол метод «подписи метода запроса» и запустить его methodSignatureForSelector: на удаленном объекте, а также кодировать и возвращать результат. Вот что делает NSDistantObject.

Предоставление setProtocolForProxy: является важной оптимизацией, если вы собираетесь много болтать, но она ограничивает вас объектами, для которых у вас есть протокол, и до 10.5, которая вводит некоторые раздражающие ограничения (требуются все методы) , Даже на 10.5 это может привести к некоторым проблемным ограничениям, если это единственный способ получить сигнатуры методов.

@ cocoafan, я думаю, что вы, вероятно, правы, создавая это с нуля поверх NSProxy, но посмотрите на NSConnection и посмотрите, можете ли вы подклассом управлять сетевым подключением так, ты хочешь. Если вы можете найти способ сделать это (хотя я не вижу простого пути сразу), вы, вероятно, получите много вещей бесплатно от NSDistantObject.

1 голос
/ 02 июня 2009

Способ NSDistantObject обрабатывает это его методом setProtocolForProxy:, который указывает протокол, содержащий список методов, которые обрабатывает объект на другом конце соединения. Затем он может использовать информацию для этих методов для предоставления соответствующих NSMethodSignature объектов при выполнении пересылки.

Похоже, что наиболее просто это сделать с помощью функции protocol_getMethodDescription(), объявленной в <objc/runtime.h>. Это возвращает objc_method_description структуру, которая содержит поле types. Я считаю, что вы должны иметь возможность передать это значение в +[NSMethodSignature signatureWithObjCTypes:], чтобы получить объект сигнатуры метода, который соответствует тому, что объявлено в протоколе.

0 голосов
/ 10 июня 2009

Я нашел умное решение для генерации NSInvocation объектов.

...