13

初めて Objective-C ブロックとオペレーション キューを使用しています。メイン UI にスピナーが表示されている間に、いくつかのリモート データを読み込んでいます。完了ブロックを使用して、テーブルにデータをリロードするように指示しています。ドキュメントに記載されているように、完了ブロックはメイン スレッドで実行されないため、テーブルはデータをリロードしますが、テーブルをドラッグするなどのメイン スレッドで何かを実行するまでビューを再描画しません。

私が現在使用しているソリューションはディスパッチ キューです。これは、完了ブロックから UI を更新する「最良の」方法ですか?

    // 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]; }];
};
4

1 に答える 1

18

まさにそれです。[NSOperationQueue mainQueue]完了ブロックに GCD の代わりに操作キューを使用する場合にも使用できます。

于 2011-05-24T16:00:20.683 に答える