Это правильное использование блока завершения Очереди операций? - PullRequest
12 голосов
/ 24 мая 2011

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

17 голосов
/ 24 мая 2011

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

...