我有一个模型Model
,它通过JSON API加载一些东西,然后我在UI中以某种方式显示它。假设一次只有一个current
实例(根据时间从服务器获取),所以我有一个类似于[Model current]
的方法调用。
问题是我需要在数据加载时做一些事情,这导致我有两种可能的解决方案:
[Model currentWithDelegate:self]
之类的地方,我将在self
上实施一个具有回调的协议[Model currentWithSuccess:^(id response) { ... } error:^(NSError *error) { ... }]
由于我是一名JavaScript / Ruby开发人员,我很习惯2.
,但考虑到在iOS上使用委托的频率,我在想这里是否也是正确的方法?
在iOS上处理异步的事实上的标准或最佳做法是什么?还有其他更好的方法吗?
答案 0 :(得分:2)
我认为既然你只做了两件事(报告成功或失败),代表就会有些过分,如果你使用一个块它会提高可读性,因为你可以在阅读代码时轻松看到会发生什么在两种情况下执行而不必搜索它。
这可能很有用(强调我的):http://stablekernel.com/blog/blocks-or-delegation/
如果我查看NSURLConnectionDelegate和NSURLConnectionDataDelegate,我会看到一些消息,上面写着“我正在开始这样做”,“这是我目前所知道的”,“我已经完成了这个,”或“亲爱的上帝的世界终于结束了! dealloc的! DEALLOC!“这些消息概述了一个过程,感兴趣的代表希望在每一步都获得通知。
当我查看处理程序和完成方法时,我看到一个包含响应对象和错误对象的块。 没有任何沟通,“这是我到目前为止的地方,而且我还在工作。”
因此,我们可以说委托回调更注重流程,块更注重结果。如果您需要在多步骤过程中获得通知,您可能希望使用委派。如果您只想要您要求的信息(或有关未能获取信息的详细信息),您应该使用一个块。 (如果将此与此列表中的第3项结合使用,您将意识到委托可以在所有这些事件中保持状态,而多个独立块则不能。)
答案 1 :(得分:1)
两者都有不同的用途。
如果您希望能够在对象分配的同时包含回调代码,并且只有一个或两个不同的回调,则块非常有用。
如果你想让一个不同的对象处理回调,或者让一个对象处理各种其他对象的回调(当然你仍然可以使用块来执行此操作),代理很好,但是委托模式更自然)。代表也很好,因为你有一个明确定义的协议,如果你有许多不同的回调(其中一些可能是必需的,一些可能是可选的)很有用,这将需要许多块属性。
一般来说,我倾向于在我自己的代码中大部分时间使用块,但如果你发现代理更有意义的情况,请改用它们。