Objective C委托还是C风格的块回调?

时间:2014-02-14 05:36:33

标签: ios objective-c c lambda delegates

我正在设计一个类,只要发生某事,它就会“触发事件”。这些事件往往与非UI相关。我想知道这样做的最佳方法是什么。我一直在探索:

代表

我将定义一个委托类,在init函数中接受委托,并在事件发生时调用委托类上的方法。

C风格的块

我将定义一个函数指针,并在init函数中接受一个函数。我会在事件发生时给它打电话。

在这两种情况下,我可能需要处理多个“源”,因此我需要一组委托或块。

我注意到在iOS编程中,代表往往更喜欢UI框架。但是我来自函数式编程背景,我非常适合接受函数点并在调用站点传递lambdas,我喜欢编译器为你处理吊装变量,而你通常需要较少的类状态。但我发现很多iOS开发人员都在使用代理。

iOS中通常首选的机制是什么?

3 个答案:

答案 0 :(得分:18)

每个都有它的用途。

当有多个“事件”告诉委托有关和/或何时类需要从委托中获取数据时,应使用委托。一个很好的例子是UITableView

当只有一个(或两个)事件时,最好使用一个块。完成块(可能是故障块)就是一个很好的例子。一个很好的例子是NSURLConnection sendAsynchronousRequest:queue:completionHandler:

第三个选项是通知。当事件中可能存在多个(和未知的)相关方时,最好使用此方法。其他两个仅在有一个(和已知的)感兴趣方时才有用。

答案 1 :(得分:0)

使用委托意味着在架构方面比使用简单的回调块更紧密耦合。对于非复杂的情况,代表可能是一种矫枉过正的行为。

将块存储在某个容器中是正常的,但您应该提前考虑在以后某些时候删除它们的可能性(这将需要一些工作),我的意思是用于删除已添加的处理程序的附加接口。

答案 2 :(得分:0)

对于您的用例NSNotification似乎是最佳选择。然后,需要这些事件的对象可以注册这些通知。