3

私の iOS アプリでは、次のようなバックグラウンド スレッドで計算負荷の高いタスクを実行しています。

// f is called on the main thread
- (void) f {
    [self performSelectorInBackground:@selector(doCalcs) withObject:nil]; 
}

- (void) doCalcs {
    int r = expensiveFunction();
    [self performSelectorOnMainThread:@selector(displayResults:) withObject:@(r) waitUntilDone:NO];
}

メインスレッドをブロックしないように、GCD を使用して高価な計算を実行するにはどうすればよいですか?

GCD キューの選択に関するいくつかのオプションを見てきましたがdispatch_async、GCD に慣れていないため、十分に理解しているとは思えません。

4

1 に答える 1

10

提案されているように、dispatch_async を使用します。

例えば:

    // Create a Grand Central Dispatch (GCD) queue to process data in a background thread.
dispatch_queue_t myprocess_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

// Start the thread 

dispatch_async(myprocess_queue, ^{
    // place your calculation code here that you want run in the background thread.

    // all the UI work is done in the main thread, so if you need to update the UI, you will need to create another dispatch_async, this time on the main queue.
    dispatch_async(dispatch_get_main_queue(), ^{

    // Any UI update code goes here like progress bars

    });  // end of main queue code block
}); // end of your big process.
// finally close the dispatch queue
dispatch_release(myprocess_queue);

以上が大まかな流れです、参考になれば幸いです。

于 2013-08-20T20:53:00.910 に答える