刚刚,阿里开源 iOS 协程开发框架 coobjc!( 七 )

上述第三种和第四种只是能过做到跳转 , 但是没法保存调用栈上的状态 , 看起来基本上不能算是实现了协程 , 只能算做做demo , 第五种除非官方支持 , 否则自行改写编译器通用性很差 。 而第一种方案的 ucontext 在iOS上是废弃了的 , 不能使用 。 那么我们使用的是第二种方案 , 自己用汇编模拟一下 ucontext 。

模拟ucontext的核心是通过getContext和setContext实现保存和恢复调用栈 。 需要熟悉不同CPU架构下的调用约定(Calling Convention). 汇编实现就是要针对不同cpu实现一套 , 我们目前实现了 armv7、arm64、i386、x86_64 , 支持iPhone真机和模拟器 。

Show me the code

说了这么多 , 还是看看代码吧 , 我们从一个简单的网络请求加载图片功能来看看coobjc到底是如何使用的 。

下面是最普通的网络请求的写法:

下面是使用coobjc库协程化改造后的代码:

原本需要20行的代码 , 通过coobjc协程化改造后 , 减少了一半 , 整个代码逻辑和可读性都更加好 , 这就是coobjc强大的能力 , 能把原本很复杂的异步代码 , 通过协程化改造 , 转变成逻辑简洁的顺序调用 。

推荐阅读