例如,我有这个自定义操作:
class CustomOperation: Operation {
override init() {
super.init()
self.qualityOfService = .userInitiated
}
override func main() {
// ..
}
}
这就是我正在做的运行CustomOperation
:
let customOperation = CustomOperation()
customOperation.completionBlock = { print("custom operation finished") }
customOperation.start()
我有几个CustomOperation
试图同时运行。无论如何都要在不为每个OperationQueue
创建CustomOperation
的情况下运行异步?因为isAsynchronous
属性是只读的。
答案 0 :(得分:1)
您不必为每个操作创建队列。您可以将它们全部放在同一个队列中。队列maxConcurrentOperationCount
确定同时运行的数量。
如果您根本不想使用队列,则需要覆盖start()和isAsynchronous()并让start()启动一个线程并运行。你需要做的还有更多(阅读文档)
https://developer.apple.com/reference/foundation/operation
转到“覆盖部分的方法”
如果要创建并发操作,则至少需要覆盖以下方法和属性:
- 开始()
- isAsynchronous
- isExecuting
- isFinished
在并发操作中,start()方法负责以异步方式启动操作。无论是生成线程还是调用异步函数,都可以通过此方法完成。在开始操作时,start()方法还应该更新isExecuting属性报告的操作的执行状态。您可以通过发送isExecuting密钥路径的KVO通知来执行此操作,该路径允许感兴趣的客户端知道该操作现在正在运行。您的isExecuting属性还必须以线程安全的方式提供状态。