coobjc includes a suite of unit tests within the Tests subdirectory. These tests can be run simply be executed the test action on the platform framework you would like to test.
0x7 致谢
coobjc 离不开下面这些项目和文章的帮助:
Promises - Google 开源的 Objective-C 和 Swift 版本的 Promise 框架
这个库为 Objective-C 和 Swift 提供了协程功能。coobjc 支持 await、generator 和 actor model,接口参考了 C# 、Javascript 和 Kotlin 中的很多设计。我们还提供了 cokit 库为 Foundation 和 UIKit 中的部分 API 提供了协程化支持,包括 NSFileManager , JSON , NSData , UIImage 等。coobjc 也提供了元组的支持。
0x0 iOS 异步编程问题
基于 Block 的异步编程回调是目前 iOS 使用最广泛的异步编程方式,iOS 系统提供的 GCD 库让异步开发变得很简单方便,但是基于这种编程方式的缺点也有很多,主要有以下几点:
上述问题反应到线上应用本身就会出现大量的多线程崩溃
0x1 解决方案
上述问题在很多系统和语言中都会遇到,解决问题的标准方式就是使用协程。这里不介绍太多的理论,简单说协程就是对基础函数的扩展,可以让函数异步执行的时候挂起然后返回值。协程可以用来实现 generator ,异步模型以及其他强大的能力。
Kotlin 是这两年由 JetBrains 推出的支持现代多平台应用的静态编程语言,支持 JVM ,Javascript ,目前也可以在 iOS 上执行,这两年在开发者社区中也是比较火。
在 Kotlin 语言中基于协程的 async/await ,generator/yield 等异步化技术都已经成了语法标配,Kotlin 协程相关的介绍,大家可以参考:https://www.kotlincn.net/docs/reference/coroutines/basics.html
0x2 协程
协程的概念在60年代就已经提出,目前在服务端中应用比较广泛,在高并发场景下使用极其合适,可以极大降低单机的线程数,提升单机的连接和处理能力,但是在移动研发中,iOS和android目前都不支持协程的使用
0x3 coobjc 框架
coobjc 是由手机淘宝架构团队推出的能在 iOS 上使用的协程开发框架,目前支持 Objective-C 和 Swift 中使用,我们底层使用汇编和 C 语言进行开发,上层进行提供了 Objective-C 和 Swift 的接口,目前以 Apache 开源协议进行了开源。
0x31 安装
0x32 文档
0x33 特性
async/await
使用
co_launch
方法创建协程co_launch
创建的协程默认在当前线程进行调度在协程中我们使用 await 方法等待异步方法执行结束,得到异步执行结果
上述代码将原本需要
dispatch_async
两次的代码变成了顺序执行,代码更加简洁在协程中,我们所有的方法都是直接返回值的,并没有返回错误,我们在执行过程中的错误是通过
co_getError()
获取的,比如我们有以下从网络获取数据的接口,在失败的时候, promise 会reject:error
。那我们在协程中可以如下使用:
生成器
我们使用
co_sequence
创建生成器在其他协程中,我们可以调用
next
方法,获取生成器中的数据生成器可以在很多场景中进行使用,比如消息队列、批量下载文件、批量加载缓存等:
通过生成器,我们可以把传统的生产者加载数据->通知消费者模式,变成消费者需要数据->告诉生产者加载模式,避免了在多线程计算中,需要使用很多共享变量进行状态同步,消除了在某些场景下对于锁的使用。
Actor
我们可以使用
co_actor_onqueue
在指定线程创建 actoractor 的
send
方法可以给 actor 发送消息元组
使用
co_tuple
方法来创建元组可以在元组中存储任何数据
可以使用
co_unpack
方法从元组中取值首先创建一个 promise 来处理元组里的值
然后,你可以像下面这样获取元组里的值:
使用元组你可以从
await
返回值中获取多个值演示项目
我们以 GCDFetchFeed 开源项目中 Feeds 流更新的代码为例,演示一下协程的实际使用场景和优势,下面是原始的不使用协程的实现:
下面是
viewDidLoad
中对上述方法的调用:上述代码无论从可读性还是简洁性上都比较差,下面我们看一下使用协程改造以后的代码:
下面是
viewDidLoad
中使用协程调用该接口的地方:协程化改造之后的代码,变得更加简单易懂,不易出错
Swift
coobjc 通过上层封装来全面支持 Swift ,这使得我们可以提早在 Swift 中使用协程。
由于 Swift 拥有更丰富和更高阶的语法支持,因而 coobjc 在 Swift 中的使用会更优雅,例如:
0x4 协程的优势
0x5 交流
0x6 单元测试
coobjc includes a suite of unit tests within the Tests subdirectory. These tests can be run simply be executed the test action on the platform framework you would like to test.
0x7 致谢
coobjc 离不开下面这些项目和文章的帮助:
0x8 作者
0x9贡献代码
0xA 协议
coobjc 使用 Apache 2.0 协议,详情见 LICENSE 文件。