Я впервые использую блоки Objective-C и очереди операций. Я загружаю некоторые удаленные данные, в то время как основной пользовательский интерфейс показывает счетчик. Я использую блок завершения, чтобы указать таблице перезагрузить свои данные. Как документация упоминает, блок завершения не запускается в основном потоке, поэтому таблица перезагружает данные, но не перерисовывает представление, пока вы не сделаете что-то в основном потоке, например перетащите таблицу.
Решение, которое я сейчас использую, — это очередь отправки. Это «лучший» способ обновить пользовательский интерфейс из блока завершения?
// 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]; }];
};