2010-05-11 153 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