是否可以在不访问它的情况下取消 nsoperation?
Is it possible to cancel nsoperation without access to it?
我需要使用无法正常运行的库。在调用某些方法后,它会创建一些 NSOperation
,它永远不会完成并以休眠状态 mach_msg_trap
错误结束,因为我没有这些操作的实例,所以我无法取消它。
是否可以在没有访问权限的情况下取消它?
您是否有权访问添加了这些操作的 NSOperationQueue
?
如果是,你可以这样访问:
var queue = NSOperationQueue.mainQueue()
// or
queue = NSOperationQueue.currentQueue()!
let operations = queue.operations
for operation in operations{
if operation.name == "name of operation if you know it" {
operation.cancel()
}
}
请注意,即使您可以访问 NSOperation
或其队列,"cancel" 并不意味着 "make go away." 它只意味着 "don't start if it hasn't been started yet, and if it has been started, set the cancel flag." 如果 NSOperation
不检查它的取消标志,那么它仍然不会终止。没有办法做你想做的事,这是故意的。强行终止操作会使程序处于未定义状态。
听起来你要么是库中有错误,要么是你使用库的方式有错误(我怀疑后者先于前者,但这取决于库)。您将需要追踪并解决该错误。
我需要使用无法正常运行的库。在调用某些方法后,它会创建一些 NSOperation
,它永远不会完成并以休眠状态 mach_msg_trap
错误结束,因为我没有这些操作的实例,所以我无法取消它。
是否可以在没有访问权限的情况下取消它?
您是否有权访问添加了这些操作的 NSOperationQueue
?
如果是,你可以这样访问:
var queue = NSOperationQueue.mainQueue()
// or
queue = NSOperationQueue.currentQueue()!
let operations = queue.operations
for operation in operations{
if operation.name == "name of operation if you know it" {
operation.cancel()
}
}
请注意,即使您可以访问 NSOperation
或其队列,"cancel" 并不意味着 "make go away." 它只意味着 "don't start if it hasn't been started yet, and if it has been started, set the cancel flag." 如果 NSOperation
不检查它的取消标志,那么它仍然不会终止。没有办法做你想做的事,这是故意的。强行终止操作会使程序处于未定义状态。
听起来你要么是库中有错误,要么是你使用库的方式有错误(我怀疑后者先于前者,但这取决于库)。您将需要追踪并解决该错误。