#cocoa-touch #ios #nsoperationqueue #grand-central-dispatch
#cocoa-touch #iOS #nsoperationqueue #grand-central-dispatch
Вопрос:
Я впервые использую блоки 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]; }];
};
Ответ №1:
Это именно так. Вы также можете использовать [NSOperationQueue mainQueue]
, если хотите использовать очередь операций вместо GCD для вашего блока завершения.
Комментарии:
1. Круто, я не знал о mainQueue. Таким образом, немного чище и последовательнее. Спасибо!
2. Есть ли реальная разница между использованием [NSOperationQueue mainQueue] и dispatch_get_main_queue()?
3. Что касается результата, нет. Но это отличается тем, как вы его используете.
NSOperationQueue
использует (очевидно)NSOperation
, а GCD (dispatch_get_main_queue) использует блок.4. @gcamp Но NSOperation / Queue реализован с помощью GCD, так что в любом случае это smae, не так ли?
5. @0xSina Конечный результат тот же, да, но API отличается. Это именно то, что я сказал в своем предыдущем комментарии.