2009-06-01 27 views
5

我想代碼轉發方法調用的另一個對象通過TCP 沒有NSConnectionNSDistanceObject東西。我想要的是我自己的協議。使用NSProxy和forwardInvocation:

問題是,子類NSProxy和覆蓋forwardInvocation:是不夠的。我還重寫methodSignatureForSelector

這是我的問題:

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

回答

1

方式NSDistantObject處理,這是通過其setProtocolForProxy:方法,該方法指定包含的方法列表中的協議上的另一端的對象連接手柄。然後它可以使用這些方法的信息在轉發時提供適當的對象NSMethodSignature

看起來最直接的做法是通過<objc/runtime.h>中聲明的protocol_getMethodDescription()函數。這將返回一個objc_method_description結構,其中包含types字段。我相信你應該能夠將該值傳遞給+[NSMethodSignature signatureWithObjCTypes:]以獲得匹配協議中聲明的方法簽名對象。

2

@Brian,這可能沒問題,但setProtocolForProxy:只是爲了優化。可可風可以爲他的解決方案授權,但它不會是一個直接替代品。你應該能夠自動獲取簽名。爲此,網絡協議需要一種方法來請求籤名。

我認爲這裏的解決方案是在網絡協議中包含一個「請求方法簽名」的方法,並讓它在遠處的對象上運行methodSignatureForSelector:並對結果進行編碼和返回。這就是NSDistantObject所做的。

提供setProtocolForProxy:是一個重要的優化,如果你要喋喋不休,但它確實限制了你有一個協議的對象,並且在10.5之前引入了一些惱人的限制(需要所有的方法)。即使在10.5上,如果它是唯一獲取方法簽名的方法,也可能會引入一些有問題的限制。

@cocoafan,我認爲你可能有權在NSProxy的基礎上從零開始創建它,但是請看看NSConnection,看看你是否可以按照你想要的方式對它進行子類別管理。如果你可以找到一種方法來做到這一點(儘管我沒有看到一個簡單的方法),你可能會從NSDistantObject免費獲得很多東西。

+0

建議採取,謝謝你們。我將用XML-RPC取代通信。我不知道這是否可能通過重寫NSConnection。 – cocoafan 2009-06-02 08:59:25

相關問題