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

Я впервые использую блоки 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]; }];
};

person Jeremy Mullin    schedule 24.05.2011    source источник


Ответы (1)


Это точно. Вы также можете использовать [NSOperationQueue mainQueue], если хотите использовать очередь операций вместо GCD для своего блока завершения.

person gcamp    schedule 24.05.2011
comment
Круто, я не знал о mainQueue. Так будет немного чище и последовательнее. Спасибо! - person Jeremy Mullin; 24.05.2011
comment
Есть ли реальная разница между использованием [NSOperationQueue mainQueue] и dispatch_get_main_queue()? - person Greg Maletic; 08.06.2011
comment
Что касается результата, то нет. Но это отличается от того, как вы его используете. NSOperationQueue использует (очевидно) NSOperation, а GCD (dispatch_get_main_queue) использует блок. - person gcamp; 08.06.2011
comment
@gcamp Но NSOperation/Queue реализована с помощью GCD, так что в любом случае это плохо, не так ли? - person 0xSina; 14.01.2013
comment
@0xSina Конечный результат тот же, да, но API другой. Именно это я и сказал в своем предыдущем комментарии. - person gcamp; 15.01.2013
comment
Целый день отлаживался, чтобы выяснить, что мое завершение, вызванное через OperationQueue.main внутри блочной операции, не вызывало завершение, и что изменение его на Dispatch.async было исправлением. - person Fawkes; 06.06.2018