目标C委托还是C风格块回调



我正在设计一个类,每当发生什么事情时都会"触发事件"。这些事件往往与UI无关。我想知道最好的方法是什么。我一直在探索:

代表

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

C样式块

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

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

我注意到,在iOS编程中,代理往往是首选,尤其是UI框架。但我来自函数式编程背景,在那里我绝对能够接受函数点并在调用站点传递lambda,我喜欢编译器为您处理提升变量,而且您通常需要更少的类状态。但我看到很多iOS开发人员都在使用代理。

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

每个都有自己的用途。

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

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

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

使用委托意味着在架构方面比使用简单的回调块更紧密地耦合。对于非复杂的情况,委托可能是一种过度的手段。

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

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

最新更新