`
lizhuang
  • 浏览: 899826 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于 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 设计显的合理、可靠、优雅。
分享到:
评论

相关推荐

    Drupal7 API

    常见的钩子包括`hook_menu()`、`hook_block_info()`、`hook_nodeapi()`等。每个钩子都有特定的功能和用途,比如`hook_menu()`用于定义菜单项,`hook_block_info()`用于注册区块信息。 - **服务与对象**:Drupal 7...

    STM32 进阶课程-LwIP Interface (RAW API).pdf

    1. LwIP RAW API的设计和实现,以及其与RTOS的结合使用。文档提及了基于RAW API的RTOS控制,不需要PCB(协议控制块)调用方法。这里的“PCB”在LwIP中指的是协议控制块(protocol control block),是维护连接状态的...

    JS使用百度地图API自动获取地址和经纬度操作示例

    JavaScript(简称JS)是一种广泛用于网页设计的脚本语言,结合百度地图API,可以实现动态地在网页上展示地图,并获取用户的地理位置信息。通过本文的介绍,我们可以了解到如何使用JavaScript和百度地图API来自动获取...

    ios-SelctPlaneTrainPlace.zip

    在iOS编程中,回调(callback)机制通常是通过Block实现的。Block是一种闭包,可以捕获和存储其所在上下文中的变量,允许我们在代码的其他地方使用这些变量。在这个场景下,"通过block回调"可能意味着当用户选择了一...

    lwip数据接收发送过程.pdf

    这些操作都是通过LWIP提供的API函数来实现的。 2. 创建PCB(Protocol Control Block)和绑定IP地址和端口号 在LWIP中,PCB(Protocol Control Block)是TCP连接的控制块,它包含了TCP连接的所有信息。通过tcp_new...

    应用Dephi 开发佳能照相机API

    When using the EDSDK libraries, you must call this API once before using EDSDK APIs. Parameters: In: None Out: None Returns: Returns EDS_ERR_OK if successful. In other cases, see EDSDKError....

    Android俄罗斯方块游戏源码

    Android游戏开发主要依赖于Android SDK,它提供了丰富的API和工具,如Android Studio,用于构建、测试和调试应用程序。游戏通常基于Java或Kotlin编程语言,结合OpenGL ES进行图形渲染。对于俄罗斯方块这样的2D游戏,...

    C++实现俄罗斯方块(windows API)

    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); char szClassName[ ] = "CodeBlocksWindowsApp"; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR ...

    上拉加载下拉刷新

    4. **Block调用**:描述中的"block调用"通常指的是在iOS开发中的闭包(Closure)或代理(Delegate)机制。闭包允许开发者在定义方法时嵌入一段代码块,使其更具有灵活性。在上拉加载下拉刷新的场景中,当用户触发...

    俄罗斯方块C++代码

    ### 俄罗斯方块C++代码解析 #### 一、概览 本文将深入解析一个用C++编写的俄罗斯方块游戏代码片段。...此外,对于游戏开发感兴趣的同学来说,本代码提供了一个很好的学习范例,有助于深入理解游戏设计和实现的细节。

    3种不同的ContextMenu右键菜单演示.

    在计算机用户界面设计中,右键菜单(通常称为ContextMenu)是一种常见的交互元素,它为用户提供了一种快捷方式来访问特定的操作或功能。本教程将详细讲解三种不同的ContextMenu实现方法,帮助开发者更好地理解和应用...

    程序员编程常用词汇.docx

    Adapter 是一个常用的设计模式,指的是将一个类的接口转换为另一个接口,从而使得两个原本不兼容的类能够一起工作。Adapter 模式可以解决不同接口之间的不兼容问题,提高系统的灵活性和可扩展性。 Algorithm ...

    使用QQ做为第三方登录平台(ios)

    openApi.redirectUri = "yourapp://qq.callback" openApi.loginWithScope("snsapi_login") { (result, error) in if let error = error { // 处理登录失败的情况 } else if let result = result { // 获取到...

    jQuery纵向排列树形图菜单代码.zip

    这通常涉及到CSS布局的调整,如使用`display: inline-block`或`float: left`属性让每个菜单项在一行内自适应排列。同时,ZTree的配置也需要相应调整,以支持这种布局方式,例如设置`view:{showLine:true,showIcon:...

    俄罗斯方块程序 C++

    通过上述分析,我们可以看到这个简单的俄罗斯方块游戏利用了C++和Windows API来实现基本的游戏功能。它不仅包含了游戏逻辑的编写,还涉及到了窗口管理和图形界面的设计。对于初学者来说,这是一个非常好的学习示例,...

    jQuery漂亮示例插件(jPaginate)

    **jQuery漂亮示例插件(jPaginate)详解** 在网页设计和开发中,当数据量过大时,分页是一个常见的解决方案,它可以帮助...这个插件提供了简单易用的API,同时支持高度定制,使得在各种网页项目中应用分页变得轻松自如。

    jquery-1.1.3 效率提高800%

    jQuery.get( url, [data], [callback] )参数: url (String): 装入页面的URL地址 Map(可选): (可选)发送到服务端的键/值对参数 callback (Function): (可选) 当远程页面装入完成时执行的函数 ...

    支付宝最新SDK

    在集成过程中,关键的API包括调用`AlipaySDK`提供的`payOrder:fromViewController:callback:`方法发起支付请求。这个方法需要传入订单信息(如商品详情、金额、交易号等)和一个回调Block,用于处理支付结果。订单...

Global site tag (gtag.js) - Google Analytics