代码块是否完全取代了代理?

LK.*_*LK. 25 delegates ios4

现在最终支持iphone/ipad开发的块,这些是否完全消除了委托的需要,或者代理仍然更清洁作为完整的接口实现,而块更适合单个任务?

Tom*_*mmy 42

我一直在寻找关于此的官方文档,但还没有找到任何.在回顾iOS 5中公开的新类以及对预先存在的类添加的新类的基础上,我建议我的团队假设一个委托协议,但是当该特定调用与之间存在直接的因果关系时,提供一个块.块的性能.

因此,根据经验,当需要持续通信时,委托协议是正确的,导致通信的动作是分散的,或者动作是从第三个源发出的.块主要与异步动作和特别是单镜头类相关联.

编辑:所以,一些例子:

UIScrollViewDelegate是正确的委托协议,因为(i)可能需要传达的内容很多; (ii)他们可能需要在任何时间以任何顺序进行沟通; (iii)他们将以超出代表控制权的原因进行沟通.

NSURLConnection +sendAsynchronousRequest:queue:completionHandler:正确地采取一个块来提供结果,因为(i)只有一个结果要报告; (ii)报告的回复是呼叫者采取行动的直接后果.

  • @Sandy我主张块是提供特定操作结果的好方法,但却是更通用对话的糟糕基础.提供一个块就像听众说'这就是你跟我说话'; 代表协议就像说话者说'这就是我将如何与你交谈'.如果说话者主要决定何时说话,那么它应该决定如何谈话.如果听众只是要求完成一件特定的事情并且报告结果,那么它就会说"......然后像这样报告". (11认同)

Joh*_*ker 9

有趣的想法 - 虽然您可以使用块/闭包代替回调方法,但我看不出如何使用它来替换委托系统 - 在所有委托几乎都是对象通信的对象之后,因此可能性比简单地执行任意代码要丰富得多.

因此,我必须同意你的"更适合单一任务"的评论(甚至只有某些孤立的任务).


D. *_*ick 8

我试图决定是否应该对其他答案发表评论或者留下我自己的答案.我决定,在这里.

我主要是C#开发人员,因此我可以很容易地看到如何用块替换整个委托模式,因为C#始终将动词视为一等公民.事实上,这是我开始使用Java和Android平台时最难习惯的事情之一.当我学习Objective-C和Cocoa时,这种经历变得更加容易.

我认为这是一个观察者模式与委托模式实现细节,我并不特别强烈.我在继承方面的构成非常多,所以我经常使用委托模式,即使在C#中也是如此.

我不认为任何一个应该取代另一个.我认为应该使用两种模式,每种模式都是最合适的; 但是,我发现了几个实例,我肯定更喜欢观察者模式而不是Cocoa中的委托模式.

例如,我觉得处理UIAlertView的结果应该基于块而不是委托.这对我来说总觉得有些奇怪,但是当API的特定部分被开发出来时,阻止是不可用的.结果,我从未确定Apple是否认为这应该是首选方法,或者当时这是唯一的方法.

最近,我将GameKit集成到我的一个游戏中,发现大多数异步调用(事实上,我使用过的所有调用)都不使用委托; 他们使用积木.我想如果他们今天可以重写UIAlertView,他们可能会使用块代替委托来处理用户输入后的回调.当然,这只是猜测.

对你的问题的简短回答:我在编写对象时更喜欢委托模式,以避免不必要的复杂继承层次结构,当我处理类似于回调和事件处理程序之类的事情时,我更喜欢观察者模式.我使用前者的代表和后者的块.