在 OperationQueue 中运行任务

你可以将 OperationQueue 视为一系列等待执行的任务。与 GCD 中的调度队列不同,操作队列不是 FIFO(先进先出)。相反,只要有足够的系统资源允许,它们就会在准备好执行任务后立即执行。

得到主要的 OperationQueue

Version >= 3.0

let mainQueue = OperationQueue.main

创建自定义 OperationQueue

Version >= 3.0

let queue = OperationQueue()
queue.name = "My Queue"
queue.qualityOfService = .default

服务质量指定了工作的重要性,或者用户可能会指望该任务的即时结果。

添加 OperationOperationQueue

Version >= 3.0

// An instance of some Operation subclass
let operation = BlockOperation {
    // perform task here
}

queue.addOperation(operation)

添加块到 OperationQueue

Version >= 3.0

myQueue.addOperation {
    // some task
}

添加多个 Operations 到 OperationQueue

Version >= 3.0

let operations = [Operation]()
// Fill array with Operations

myQueue.addOperation(operations)

调整队列中可同时运行的 Operations 数量:

myQueue.maxConcurrentOperationCount = 3 // 3 operations may execute at once

// Sets number of concurrent operations based on current system conditions
myQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount

挂起队列将阻止它开始执行任何现有的,未启动的操作或添加到队列的任何新操作。恢复此队列的方法是将 isSuspended 设置回 false

Version >= 3.0

myQueue.isSuspended = true

// Re-enable execution
myQueue.isSuspended = false

暂停 OperationQueue 不会停止或取消已经执行的操作。应该只尝试挂起你创建的队列,而不是全局队列或主队列。