私のプロジェクトでは、以下を使用してバックグラウンドスレッドで操作を実行しますNSBlockOperation
。
var operationQueue = NSOperationQueue()
var iop = NSBlockOperation(block: { self.reloadSize() /*calculation...*/ })
operationQueue.addOperation(iop)
バックグラウンドスレッドでの計算が完了した直後table.reloadData()
に、NSTableViewで:を呼び出す必要があります。まったく同じスレッドでそれを行いますが、自動レイアウトの問題のため、テーブルをメインスレッドに再ロードする必要があります。どうすれば両方のスレッド間でこの非同期関係を実現できますか?
2つの可能なアプローチ:
ブロック内からテーブルのリロードをディスパッチします。
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)
個人的には、私は一般的に最初のアプローチに傾倒しますが、後者のアプローチはより複雑なシナリオで役立つ可能性があります(たとえば、完了操作は他の多くの操作に依存しています)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加