运行 在后台线程上的 NSBlockOperation 之后立即在主线程上阻塞
run a block on main thread immediately after NSBlockOperation on background thread
在我的项目中,我 运行 使用 NSBlockOperation
在后台线程上进行操作:
var operationQueue = NSOperationQueue()
var iop = NSBlockOperation(block: { self.reloadSize() /*calculation...*/ })
operationQueue.addOperation(iop)
在后台线程中的计算完成后,我需要立即调用: table.reloadData()
在 NSTableView 上。我会在同一个线程中执行此操作,但是,由于自动布局问题,table 必须在主线程中重新加载。如何在两个线程之间实现这种异步关系?
两种可能的方法:
从块内部调度 table 的重新加载:
let operationQueue = NSOperationQueue()
let operation = NSBlockOperation() {
self.reloadSize()
...
dispatch_async(dispatch_get_main_queue()) { // or you can use NSOperationQueue.mainQueue().addOperationWithBlock()
self.table.reloadData()
}
}
operationQueue.addOperation(operation)
或者只使用 addOperationWithBlock
:
let operationQueue = NSOperationQueue()
operationQueue.addOperationWithBlock() {
self.reloadSize()
...
dispatch_async(dispatch_get_main_queue()) { // or you can use NSOperationQueue.mainQueue().addOperationWithBlock()
self.table.reloadData()
}
}
创建一个依赖于此操作的新操作:
let operationQueue = NSOperationQueue()
let operation = NSBlockOperation() {
self.reloadSize()
...
}
let completionOperation = NSBlockOperation() {
self.table.reloadData()
}
completionOperation.addDependency(operation)
operationQueue.addOperation(operation)
NSOperationQueue.mainQueue().addOperation(completionOperation)
就我个人而言,我通常倾向于第一种方法,尽管后一种方法在更复杂的场景中更有用(例如,完成操作取决于许多其他操作)。
尝试调用 CFRunLoopRun()。
它应该在当前队列中运行。
如果您的操作运行在主队列上,则当前队列将是主队列并且操作将运行成功
在我的项目中,我 运行 使用 NSBlockOperation
在后台线程上进行操作:
var operationQueue = NSOperationQueue()
var iop = NSBlockOperation(block: { self.reloadSize() /*calculation...*/ })
operationQueue.addOperation(iop)
在后台线程中的计算完成后,我需要立即调用: table.reloadData()
在 NSTableView 上。我会在同一个线程中执行此操作,但是,由于自动布局问题,table 必须在主线程中重新加载。如何在两个线程之间实现这种异步关系?
两种可能的方法:
从块内部调度 table 的重新加载:
let operationQueue = NSOperationQueue() let operation = NSBlockOperation() { self.reloadSize() ... dispatch_async(dispatch_get_main_queue()) { // or you can use NSOperationQueue.mainQueue().addOperationWithBlock() self.table.reloadData() } } operationQueue.addOperation(operation)
或者只使用
addOperationWithBlock
:let operationQueue = NSOperationQueue() operationQueue.addOperationWithBlock() { self.reloadSize() ... dispatch_async(dispatch_get_main_queue()) { // or you can use NSOperationQueue.mainQueue().addOperationWithBlock() self.table.reloadData() } }
创建一个依赖于此操作的新操作:
let operationQueue = NSOperationQueue() let operation = NSBlockOperation() { self.reloadSize() ... } let completionOperation = NSBlockOperation() { self.table.reloadData() } completionOperation.addDependency(operation) operationQueue.addOperation(operation) NSOperationQueue.mainQueue().addOperation(completionOperation)
就我个人而言,我通常倾向于第一种方法,尽管后一种方法在更复杂的场景中更有用(例如,完成操作取决于许多其他操作)。
尝试调用 CFRunLoopRun()。 它应该在当前队列中运行。
如果您的操作运行在主队列上,则当前队列将是主队列并且操作将运行成功