NSOperation和NSOperationQueue可以改善iOS中的并发性

通过谢尔盖·沙巴林(Sergey Shabalin)

作为我的文章“ iOS并发性简介”的后续,今天,我想分享我对如何提高iOS应用程序中的并发性水平的看法。

操作可以并发提供帮助。 操作是作业封装的一种面向对象的方法,该方法可以异步完成。 应该将操作与操作队列结合使用或独立使用。

操作对象是用于所需作业封装的Operation类实例。 Operation类本身是一个抽象类,出于实用程序的目的,该类将由子类实现。

 让队列= OperationQueue() 
queue.maxConcurrentOperationCount = 2

let operation1 = BlockOperation(block:{
...
})
operation1.qualityOfService = .userInitiated

let operation2 = BlockOperation(block:{
...
})

operation1.completionBlock = {
...
}
operation2.completionBlock = {
...
}

operation2.addDependency(operation1)

queue.addOperation(operation1)
queue.addOperation(operation2)

OperationQueue类调节操作对象集的执行。 添加到队列后,该操作将保留在该队列中,直到完成或取消。 队列中的操作根据其优先级和操作之间的依赖性进行自组织。 如果队列中的操作具有相似的优先级,则按照FIFO原理执行它们。

操作支持以下基本特征:

  • 依赖关系,防止操作在之前的操作完成之前开始。
  • 支持附加完成块。
  • 使用KVO监视操作状态的变化。
  • 支持操作优先级并影响其执行顺序。
  • 取消选项,允许在执行时停止操作。

如果操作不能完全满足应用程序的需求,则可以创建NSOperation子类以添加缺少的功能。

进口基金会

  class AsynchronousOperation:操作{ 
枚举状态: 字符串 {
准备好案例
案例执行
案例完成
私人 var keyPath: 字符串 {
得到 {
返回 “是” + self.rawValue
}
}
}
var state:State = .Ready {
willSet {
willChangeValue(forKey:newValue.rawValue)
willChangeValue(forKey:newValue.rawValue)
}
didSet {
didChangeValue(forKey:oldValue.rawValue)
didChangeValue(forKey:oldValue.rawValue)
}
}
覆盖 var isAsynchronous: 布尔 {
得到 {
返回
}
}
覆盖 var isExecuting: 布尔 {
得到 {
返回状态==。执行
}
}
覆盖 var isFinished: 布尔 {
得到 {
返回状态==。完成
}
}
覆盖 func start(){
如果 self.isCancelled {
状态=。完成
} 其他 {
状态=。就绪
主要()
}
}
覆盖 func main(){
如果 self.isCancelled {
状态=。完成
} 其他 {
状态=。执行
//带有回调{的异步逻辑(例如:n / w个调用)
}
}
}

默认情况下,对象操作以同步模式执行。 但是,如果计划通过异步执行操作来手动执行操作,则必须重新定义以下方法和属性:

  • 开始()
  • isAsynchronous
  • 正在执行
  • 已完成

执行操作开始后,它将继续完成其任务,直到完成为止,否则您的代码将彻底取消该任务。 取消可以随时发生,甚至可以在操作开始之前进行。

为了支持取消操作对象,您需要做的就是定期检查自定义代码中的isCancelled值。