Multithreading 在后台线程上执行NSBlockOperation之后,立即在主线程上运行块
在我的项目中,我使用Multithreading 在后台线程上执行NSBlockOperation之后,立即在主线程上运行块,multithreading,macos,swift,cocoa,grand-central-dispatch,Multithreading,Macos,Swift,Cocoa,Grand Central Dispatch,在我的项目中,我使用NSBlockOperation在后台线程上运行一个操作: var operationQueue = NSOperationQueue() var iop = NSBlockOperation(block: { self.reloadSize() /*calculation...*/ }) operationQueue.addOperation(iop) 后台线程中的计算完成后,我需要立即在NSTableView上调用:table.reloadData()。我会在同一个线程
NSBlockOperation
在后台线程上运行一个操作:
var operationQueue = NSOperationQueue()
var iop = NSBlockOperation(block: { self.reloadSize() /*calculation...*/ })
operationQueue.addOperation(iop)
后台线程中的计算完成后,我需要立即在NSTableView上调用:
table.reloadData()
。我会在同一个线程中这样做,但是,由于自动布局问题,必须在主线程上重新加载表。如何在两个线程之间实现这种异步关系?两种可能的方法:
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)
如果您的操作在主队列上运行,则当前队列将是主队列,并且操作将在其上成功运行完美!感谢您提供其他选择。