NSOperation 在队列结束时释放
NSOperation's released at queue ending
我有很多 UIImage 批处理操作。我将它们添加到 NSOperationQueue 的实例中一次:
self.operationQueue.addOperations(operations, waitUntilFinished: false)
但是好像operationQueue会捕获所有的操作,并在所有操作完成后释放它们。
我的操作实例继承自这个class
如何释放刚刚完成的操作?我错过了什么吗?
addOperations(operations, waitUntilFinish:false)
并不隐式保留所有操作直到完成,它本质上与for operation in operations { addOperation(operation) }
相同。证明如下。
您可能正在查看操作中的错误,它从未成功转换 to/emits isFinished
。如果您的操作最终在所有操作完成时取消分配,这似乎不太可能。
更有可能的是,您可能在某处有一些依赖于这些操作的完成代码:
- 您可以有一个闭包维护对
operations
的引用。
- 您可能有一个依赖操作:
operation.addOperation(...)
- 您可以在队列上调用
waitUntilAllOperationsAreFinished()
,它将保存对操作的引用,直到它们全部完成。
证明
您可以使用以下 playground 证明操作在完成后未保留:
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
...
我有很多 UIImage 批处理操作。我将它们添加到 NSOperationQueue 的实例中一次:
self.operationQueue.addOperations(operations, waitUntilFinished: false)
但是好像operationQueue会捕获所有的操作,并在所有操作完成后释放它们。
我的操作实例继承自这个class
如何释放刚刚完成的操作?我错过了什么吗?
addOperations(operations, waitUntilFinish:false)
并不隐式保留所有操作直到完成,它本质上与for operation in operations { addOperation(operation) }
相同。证明如下。
您可能正在查看操作中的错误,它从未成功转换 to/emits isFinished
。如果您的操作最终在所有操作完成时取消分配,这似乎不太可能。
更有可能的是,您可能在某处有一些依赖于这些操作的完成代码:
- 您可以有一个闭包维护对
operations
的引用。 - 您可能有一个依赖操作:
operation.addOperation(...)
- 您可以在队列上调用
waitUntilAllOperationsAreFinished()
,它将保存对操作的引用,直到它们全部完成。
证明
您可以使用以下 playground 证明操作在完成后未保留:
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 ...