2009-06-01 12 views
5

Chciałbym zakodować proxy, które przekazuje wywołania metod do innego obiektu przez TCP bezNSConnection i NSDistanceObject rzeczy. To, czego chcę, to mój własny protokół.Korzystanie z NSProxy i forwardInvocation:

Problem polega na tym, że podklasy NSProxy i przesłanianie forwardInvocation: nie są wystarczające. Mam też przesłonić methodSignatureForSelector

Tu jest moje pytanie:

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

Odpowiedz

1

Sposób NSDistantObject obsługuje to jest jego setProtocolForProxy: metody, która określa protokół zawierający listę metod, że obiekt na drugim końcu uchwyty połączenia. Następnie może użyć informacji o tych metodach do dostarczenia odpowiednich obiektów podczas przesyłania.

Wygląda na to, że najprościej to zrobić za pomocą funkcji protocol_getMethodDescription(), zadeklarowanej w <objc/runtime.h>. Zwraca to strukturę objc_method_description, która zawiera pole types. Wierzę, że powinieneś być w stanie przekazać tę wartość do +[NSMethodSignature signatureWithObjCTypes:], aby uzyskać obiekt sygnatury metody, który pasuje do deklarowanych w protokole.

2

@Brian, może być ok, ale setProtocolForProxy: służy tylko do optymalizacji. cocoafan mógłby zlecić to rozwiązanie, ale nie byłby to zamiennik zastępczy. Powinieneś mieć możliwość automatycznego otrzymywania podpisów. Aby to zrobić, protokół sieciowy potrzebuje sposobu na żądanie podpisu.

Uważam, że rozwiązaniem jest włączenie w protokole sieciowym metody "podpisu metody żądania" i zlecenie jej uruchomienia na odległym obiekcie i zakodowanie i zwrócenie wyniku. Tak robi NSDistantObject.

Zapewnienie setProtocolForProxy: jest ważną optymalizacją, jeśli zamierzasz dużo rozmawiać, ale ogranicza się do obiektów, dla których masz protokół, a przed 10.5 wprowadza pewne irytujące ograniczenia (wszystkie metody są wymagane). Nawet w wersji 10.5 może wprowadzić pewne problematyczne ograniczenia, jeśli jest to jedyny sposób uzyskania sygnatur metod.

@ cocoafan, myślę, że prawdopodobnie masz rację, aby stworzyć to od podstaw na NSProxy, ale spójrz na NSConnection i zobacz, czy możesz podklasować go do zarządzania połączeniem sieciowym, tak jak chcesz. Jeśli możesz znaleźć sposób na zrobienie tego (chociaż nie widzę łatwej drogi od razu), prawdopodobnie dostaniesz dużo rzeczy za darmo od NSDistantObject.

+0

Porady zrobione dzięki wam. Zamienię komunikację na XML-RPC. Nie jestem pewien, czy jest to możliwe przez nadpisanie NSConnection. – cocoafan

Powiązane problemy