我有很多UIImage批处理操作。我在NSOperationQueue:
的实例中添加了一次self.operationQueue.addOperations(operations, waitUntilFinished: false)
但似乎operationQueue捕获了所有操作并在所有操作完成后释放它们。
我的操作实例继承自此class
如何发布刚刚完成的操作?我错过了什么吗?
答案 0 :(得分:3)
addOperations(operations, waitUntilFinish:false)
在完成之前不会隐式保留所有操作,它与for operation in operations { addOperation(operation) }
基本相同。证据如下。
您可能正在查看您的操作中的一个错误,它从未成功转换为/ isFinished
。如果您的操作最终在所有操作都完成时解除分配,这似乎不太可能。
更可能的是,您可能在某处依赖于这些操作的某些完成代码:
operations
的引用。operation.addOperation(...)
waitUntilAllOperationsAreFinished()
,该队列将保留对操作的引用,直到它们全部完成。您可以通过以下操场证明操作未在完成后保留:
import Foundation
class Operation: NSOperation {
let id:Int
init(id:Int) { self.id = id }
override func main() { usleep(useconds_t(id * 100000)) }
deinit { print("Deiniting \(id)") }
}
let queue = NSOperationQueue()
do {
let operations = (0..<50).map(Operation.init)
queue.addOperations(operations, waitUntilFinished: false)
}
for i in 0..<50 {
usleep(200000)
print("Heartbeat")
}
您将看到在循环运行时以固定间隔解除分配的实例。
Deiniting 0 Deiniting 1 Heartbeat Deiniting 2 Deiniting 3 Heartbeat Deiniting 4 Deiniting 5 ...