关于 Block Callback 的 API 设计



从 iOS 4 引入的 Block 语法普遍被认为是实现 Callback 的一种更为方便的模式,相比 Delegate + Protocol 需要声明和实现一大堆方法而言,Block 的实现更为灵活,然而在实际使用中需要注意 Block 的几点不同:

1、Block 中的操作应该是独立的计算块和操作块

2、Block 将会自动 Retain 其中的对象(__block 修饰的对象除外)

3、对于可能需要被取消的异步操作而言,回调不宜使用 Block

假设在一个 ViewController 里面需要进行一些异步的数据或者网络操作,我们希望在回调方法中根据操作结果更新界面,这也是一个非常普遍的模式。而很合理的一点,当 ViewController 销毁时我们希望取消这些操作以回收系统资源,这时最好的方法并不是 Block 而是传统的 Delegate + Protocol 模式,使用 Block 将会使得 ViewController 自身的 RetainCount +1,导致无法在销毁时取消不必要的系统开销,如果使用 __block 修饰符则可能导致回调时奔溃的结果。

对于以上以及类似的情况使用传统方式则是一种更为稳妥的手段,在自身销毁时取消相关的操作并将相应的 delegate 设为 nil 即可。然而对于 Block 的实现方法仍然可以通过 Notification 规避将自身至于 block 之中,但过多的 notification 使用将会使得程序流程显的混乱不堪,对于回调一般需要在 delegate、block、notification 和 kvo 四者中选择最合适的方法,才能使得 API 设计显的合理、可靠、优雅。

猜你喜欢

转载自lizhuang.iteye.com/blog/1841547