「没有人比我更懂NSOperations」 WWDC15 Seccions 高级NSOperations

本文内容主要来自WWDC, 如有勘误欢迎指出
高级NSOperations https://developer.apple.com/wwdc15/226

NSOperation 是什么?

NSOperation:NS = NextStep 前缀简写;Operation 即操作,通俗来讲就是要做的事情,配合要处理的数据,封装成一个Operation,执行方式可以是并发方式(与并行略有不同)或非并发方式。

NSOperation 是抽象类,因此真正要使用它并需通过subclass。Foundation框架为我们提供了 NSInvocationOperation 和 NSBlockOperation 两个子类,当然你可以自定义继承实现!

// 执行
operation.start()
// 取消
operation.cancel()

operation.completionBlock = {
  // 这些是当operation执行完之后可以做的一些操作
}
「没有人比我更懂NSOperations」 WWDC15 Seccions 高级NSOperations_第1张图片
image

关于NSOperations 生命周期

如图:

Pending
Ready
Executing
Finished
Cancelled

每一个Operation实例化都处于Pending状态,之后依次 Ready -> Executing -> Finished 。

Cancelled状态

处于 Pending,Ready,Executing 状态, 没有Finished的Operation实例是可以 转换到Cancelled状态的.


「没有人比我更懂NSOperations」 WWDC15 Seccions 高级NSOperations_第2张图片
image

NSOperation中的 取消被定义为 一种简单的布尔属性被取消
理解这个属性的关键点是 它只改变 属性的状态 当你取消操作时 所出现的只是 布尔数值快速翻动
在划分 NSOperation子类时 取消NSOperation 意味着什么 取决于你的意图是什么 比如说 你的操作正在执行网络任务 取消操作意味着 取消网络通信

Ready状态 (准备)

NSOperation的准备 就绪就像取消一样 被定义成一种简单的布尔属性 即准备就绪
这个属性的意思是 操作已准备好可以执行了

var ready: Bool { get }
「没有人比我更懂NSOperations」 WWDC15 Seccions 高级NSOperations_第3张图片
image

我们来看看他是怎么工作的, 当一个NSOperation串行队列里面的第四个处于ready状态之后,处于ready的第一个执行!
因为这是一个串行队列 一次只能执行一个 若两个操作同时准备就绪 拥有较高优先权的操作 获得较早执行顺序 随后才是优先权较低的那个 当其他操作也准备就绪了 它们也将赢得队列 并被执行

Dependencies 依赖

依赖在iOS里面是很重要的使用,但是错误的使用会导致死锁的出现, 举例
操作A和操作B,B增加了对A的关联:仅当A操作完成后执行B;同时A增加了对B的关联:仅当B操作执行完成后执行A


「没有人比我更懂NSOperations」 WWDC15 Seccions 高级NSOperations_第4张图片
image

这就是一个逻辑闭环. 死锁的出现

NSOperation to execute a block

operation.completionBlock = {
  // 这些是当operation执行完之后可以做的一些操作
}

通过 在NSOperation内部 设置区块 你可以获得
许多NSOperation的好功能 比如相关性

「没有人比我更懂NSOperations」 WWDC15 Seccions 高级NSOperations_第5张图片
image
「没有人比我更懂NSOperations」 WWDC15 Seccions 高级NSOperations_第6张图片
image

上图是在WWDC app中,使用NSOperation的一个实例
第一次 抓取收藏夹 操作开始执行后 这里会进行初始请求 我们要为你查找收藏的会议记录

这样我们会发出请求操作 然后提交给这个方法 称之为执行请求操作

这是执行请求操作

请求操作完成后 我们需要先检查 看看是否有错误 如果有 我们要中止流程先处理错误

如果没有错误 但是存在指针 这是CloudKit 通过指针告诉我们 还有其他有待抓取 那么 我们要使用该指针在序列后 创建下一个CK请求操作

然后进行半递归式调用执行请求操作 这是我们执行多个请求操作的方法

另外 如果没有指针或者错误出现 那么是CloudKit 指示我们已经抓取完毕 这样我们可以开始导入

已经下载好的记录了

关于NSOperation 的一些条件

「没有人比我更懂NSOperations」 WWDC15 Seccions 高级NSOperations_第7张图片
image

一个条件指的是一个协议 我们定义的协议 这样 对于操作而言 可以表示它是如何生成相关性的
如何定义互斥性 以及如何扩展预备状态概念
这样 在样本代码中 提供了一些条件 其中之一是互斥性通用条件 这种条件表示一个操作 与相同类属的其他操作 是互相排斥的
这里我们还有可达性条件 这样通过一行代码 你可以方便地通过操作表达 只有在网速很好的情况下才执行

你可能感兴趣的:(「没有人比我更懂NSOperations」 WWDC15 Seccions 高级NSOperations)