2013-01-04 36 views
6

我有一個類,它有一個基於委託的系統來發送不同類型的請求。它使用委託在請求完成時告訴對象,並且如果它是錯誤成功的話。如何將基於委託的回調系統轉換爲基於塊的?

現在,我還必須檢查它是什麼類型的請求以迴應採取適當的措施。

我有一個包裝類,應該給我一個基於塊的接口。

我將一個完成塊和一個錯誤塊傳遞給一個請求方法,該方法應該在內部使用這個基於委託的類。

而當響應來臨時,應該自動調用該請求類型的適當處理程序,並取決於成功和錯誤。

我在SO上看到了類似的問題,但對我來說有點不清楚,所以請給出一個關於如何去解決這個問題的總體思路,而不是直接將其標記爲重複。

回答

2

這是一種方法。使用此RAExpendable類可以使用基於塊的實現動態構建委託。

比方說,你代表的是:

@protocol XDelegate 
-(void) foo:(id)response; 
@end 

https://github.com/evadne/RAExpendable添加RAExpendable.h,RAExpendable.m到您的項目。動態添加的委託方法:

RAExpendable *expendable = [RAExpendable new]; 
    [expendable addMethodForSelector:@selector(foo:) types:"[email protected]:@" block:^(id x, SEL sel, id response){ 
     NSLog(@"response is %@", response); 
    }]; 

,並設置expendable類作爲您的委託:

someObject.delegate = expendable; 

現在,如果你這樣做:

[expendable performSelector:@selector(foo:) withObject:@"OK"]; 

你得到的字符串response is OK。將NSLog替換爲您認爲合適的任何成功/失敗實現。從現在起,當您撥打foo:時,該塊將執行。

如果您想對您的用例進行修改,請注意該示例的參數爲[email protected]:@,根據運行時的Type Encoding指南表示:void return,self,SEL,object。 selfSEL是每個Objective-C方法中存在的兩個隱藏參數,第三個參數是該方法的第一個非隱藏參數。塊的簽名必須與方法的簽名匹配。

+0

多個參數的任何例子嗎?另外,當將'RAExpendable'指定爲代理時''從不兼容類型'RAExpendable * __ strong''分配'id '時,我會收到此消息。 – atulkhatri

2

隨着REKit,你可以做一個委託動態象下面這樣:

id dynamicDelegate; 
dynamicDelegate = [[NSObject alloc] init]; 
[dynamicDelegate respondsToSelector:@selector(foo:) withKey:nil usingBlock:^(id receiver, id response) { 
    NSLog(@"response is %@", response); 
}]; 
someObject.delegate = dynamicDelegate; 
+0

適用於我。我很欣賞不需要自己弄清楚Objective-C類型! – EthanB

+0

P.S. @Kazki,你忘了添加「authorhip disclaimer」。 ;) – EthanB

相關問題