未分类 · 2024年8月19日 0

NSOperation 和 GCD

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.")