別のスレッドでコードを実行する最良の方法は何ですか?それは...ですか:
[NSThread detachNewThreadSelector: @selector(doStuff) toTarget:self withObject:NULL];
または:
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(doStuff:)
object:nil;
[queue addOperation:operation];
[operation release];
[queue release];
私は2番目の方法をやっていますが、私が読んでいるWesley Cookbookでは最初の方法を使用しています。
私の意見では、最良の方法はlibdispatch、別名Grand Central Dispatch(GCD)を使用することです。 iOS 4以上に制限されますが、とてもシンプルで使いやすいです。バックグラウンドスレッドでいくつかの処理を行ってからメインの実行ループで結果を処理するコードは、非常に簡単でコンパクトです。
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Add code here to do background processing
//
//
dispatch_async( dispatch_get_main_queue(), ^{
// Add code here to update the UI/send notifications based on the
// results of the background processing
});
});
まだ行っていない場合は、libdispatch/GCD/blocksでWWDC 2010のビデオをご覧ください。
IOSでのマルチスレッドの最良の方法は、GCD(Grand Central Dispatch)を使用することです。
//creates a queue.
dispatch_queue_t myQueue = dispatch_queue_create("unique_queue_name", NULL);
dispatch_async(myQueue, ^{
//stuffs to do in background thread
dispatch_async(dispatch_get_main_queue(), ^{
//stuffs to do in foreground thread, mostly UI updates
});
});
人々が投稿したすべてのテクニックを試して、どれが最速かを確認しますが、これが最善の方法だと思います。
[self performSelectorInBackground:@selector(BackgroundMethod) withObject:nil];
NSThreadに、スレッドをブロック単位で簡単に実行できるカテゴリを追加しました。ここからコードをコピーできます。