2010-05-11 194 views
1

我有以下情形:函數指針

Class_A 
    - method_U 
    - method_V 
    - method_X 
    - method_Y 

Class_B 
    - method_M 
    - method_N 

HttpClass 
    - startRequest 
    - didReceiveResponse // is a callback 

現在我想實現這三個流(其實還有更多,但這些足以證明我的問題):

Class_A :: method_X -> HttpClass :: startRequest:params -> ... wait, wait, wait ... -> HttpClass :: didReceiveResponse -> Class_A :: method_Y:result 

和:

Class_A :: method_U -> HttpClass :: startRequest:params -> ... wait, wait, wait ... -> HttpClass :: didReceiveResponse -> Class_A :: method_V:result 

,最後一個:

Class_B :: method_M -> HttpClass :: startRequest:params -> ... wait, wait, wait ... -> HttpClass :: didReceiveResponse -> Class_B :: method_N:result 

請注意,在Class_AClass_B方法有不同的名稱和功能,他們只是讓我們同HttpClass的。現在

我的解決方案將是一個C函數指針傳遞給startRequest,其存儲在HttpClassdidReceiveResponse被調用我調用函數指針並將結果傳遞(這將永遠是一個JSON字典)。

現在我想知道是否可以有任何問題使用普通的C或者如果有更好的解決方案在更Objective-C的方式。有任何想法嗎?

回答

4

您可以使用選擇器而不是函數指針。基本上,你的第一個場景的設置是:

// declare startRequestWithDelegate method 
- startRequestWithDelegate:(id)delegate selector:(SEL)selector; 

// call it in Class_A object: 
[HTTPObject startRequestWithDelegate:self selector:@selector(method_Y:); 

// call callback method when request finished: 
if ([delegate respondsToSelector:savedSelector]) 
    [delegate performSelector:savedSelector withObject:result]; 

其他方案將在調用startRequestWithDelegate方法不同。

+0

太好了。這正是我需要的。 – znq 2010-05-11 14:13:07

1

我能想到的幾種方法,你可以做到這一點,各自有一些好處(和缺點):

  • 有HttpClass後通知在didReceiveResponse爲此Class_A和Class_B可以聽
  • 通行證Class_A和Class_B作爲代表到HttpClass,這將在didReceiveResponse
  • 使用目標和行動回調(非常類似於委託方式)被稱爲

我個人會使用代表 - 它會使未來添加更多功能更簡單,並且比使用直接函數指針更加強大。

+0

不知道第一個例子會如何工作,因爲我在同一個類中有不同的方法需要回調。第二個解決方案與弗拉基米爾的建議相同,這就是我現在實施的。完美的作品:-)我在這裏讀到的最後一個:http://goo.gl/VKBG,但不知道這是否僅適用於UI元素。但正如你所說,它與代表/選擇器的方法非常相似。感謝你的回答。 – znq 2010-05-11 14:19:53