初めて Objective-C ブロックとオペレーション キューを使用しています。メイン UI にスピナーが表示されている間に、いくつかのリモート データを読み込んでいます。完了ブロックを使用して、テーブルにデータをリロードするように指示しています。ドキュメントに記載されているように、完了ブロックはメイン スレッドで実行されないため、テーブルはデータをリロードしますが、テーブルをドラッグするなどのメイン スレッドで何かを実行するまでビューを再描画しません。
私が現在使用しているソリューションはディスパッチ キューです。これは、完了ブロックから UI を更新する「最良の」方法ですか?
// define our block that will execute when the task is finished
void (^jobFinished)(void) = ^{
// We need the view to be reloaded by the main thread
dispatch_async(dispatch_get_main_queue(),^{
[self.tableView reloadData];
});
};
// create the async job
NSBlockOperation *job = [NSBlockOperation blockOperationWithBlock:getTasks];
[job setCompletionBlock:jobFinished];
// put it in the queue for execution
[_jobQueue addOperation:job];
更新 @gcamp の提案に従って、完了ブロックは GCD の代わりにメイン操作キューを使用するようになりました。
// define our block that will execute when the task is finished
void (^jobFinished)(void) = ^{
// We need the view to be reloaded by the main thread
[[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self.tableView reloadData]; }];
};