Это правильное использование блока завершения очереди операций?

#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 отличается. Это именно то, что я сказал в своем предыдущем комментарии.