• 「御飯 iOS」
  • 关于
  • @禁書目録
  • RSS
  • Archive

Project - Mach

  • Note

    24th December 2011

    关于 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 设计显的合理、可靠、优雅。

    api block callback protocol notification delegate kvo
    1. fergusonicd890 likes this
    2. catherine25c likes this
    3. kathleentag901 likes this
    4. marjorieuy83 likes this
    5. decoteau254 likes this
    6. imach posted this
Mach

Premium Themes by Obox