NSOperation 的特性
NSOperation 是基于 GCD的更高层次抽象,它继承自 NSObject,并封装了在多线程环境中进行任务执行的常见模式。与 GCD 相比,NSOperation 有以下优点:
-
更高层次的抽象:NSOperation 提供了更易用的、高层次的API,封装了复杂的线程管理,适合需要任务管理的场景。
-
任务依赖性:NSOperation 允许操作之间建立依赖关系,使得多个任务之间的执行顺序更加明确。
-
取消和状态管理:NSOperation 提供了对任务进行取消的机制,同时提供了状态监控功能,开发者可以及时了解操作的执行状态。
-
优先级控制:通过设置操作的优先级,开发者可以更精细地控制任务的执行顺序。
-
可取消操作的封装:NSOperation 能够针对长期运行的操作提供更好的取消功能,GCD 的底层任务往往较难中止。
NSOperation 的主要 API
一些常用的 NSOperation API(及其子类 NSOperationQueue)包括:
start:开始执行操作。
main:实现操作的主要逻辑。
isExecuting、isFinished、isCancelled:管理操作的状态。
cancel:取消操作。
NSOperationQueue:
addOperation::添加单个操作到队列中。
addOperations:waitUntilFinished::添加多个操作,并选择是否等待所有操作完成。
maxConcurrentOperationCount:设置同时可以执行的操作数量。
setSuspended::暂停和恢复操作队列中操作的执行。
依赖关系:
addDependency::设置当前操作依赖于另一个操作。
removeDependency::移除操作之间的依赖。
相关代码实例:
class MyOperation: Operation {
var operationID: Int
init(operationID: Int) {
self.operationID = operationID
super.init()
}
override func main() {
if isCancelled { return }
print("operation \(operationID) started.")
sleep(2)
if isCancelled { return }
print("operation \(operationID) finished.")
}
}
let operationQueue = OperationQueue()
let operation1 = MyOperation(operationID: 1)
let operation2 = MyOperation(operationID: 2)
let operation3 = MyOperation(operationID: 3)
operation2.addDependency(operation1)
operation3.addDependency(operation2)
//operationQueue.
//operationQueue.
operationQueue.addOperations([operation1,operation2,operation3], waitUntilFinished: false)
sleep(5)
operation3.cancel()
// 等待操作完成
operationQueue.waitUntilAllOperationsAreFinished()
print("All operations completed.")