iphone ios berjalan di utas terpisah

96

Apa cara terbaik untuk menjalankan kode di utas terpisah? Apakah itu:

[NSThread detachNewThreadSelector: @selector(doStuff) toTarget:self withObject:NULL];

Atau:

    NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                        selector:@selector(doStuff:)
                                                                          object:nil;
[queue addOperation:operation];
[operation release];
[queue release];

Saya telah melakukan cara kedua tetapi Buku Masakan Wesley yang telah saya baca menggunakan yang pertama.

Mike S.
sumber

Jawaban:

243

Menurut saya, cara terbaik adalah dengan libdispatch alias Grand Central Dispatch (GCD). Ini membatasi Anda ke iOS 4 dan lebih tinggi, tetapi itu sangat sederhana dan mudah digunakan. Kode untuk melakukan beberapa pemrosesan pada thread latar belakang dan kemudian melakukan sesuatu dengan hasil di run loop utama sangat mudah dan ringkas:

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
    });
});

Jika Anda belum melakukannya, lihat video dari WWDC 2010 di libdispatch / GCD / blok.

Jacques
sumber
Saya membutuhkannya agar kompatibel dengan 3.0 :(
Mike S,
1
Kemudian antrian operasi mungkin adalah solusi terbaik berikutnya. Selain itu, pastikan Anda tidak masuk ke konkurensi terlalu cepat. Coba mulai dengan menulis hal-hal single-threaded dan profil untuk melihat apakah Anda perlu melakukan multithread, atau jika Anda dapat mendesain kode single-threaded agar lebih efisien sendiri. Untuk tugas-tugas sederhana, terkadang Anda dapat melakukan semua yang Anda butuhkan dengan performSelector: withObject: afterDelay: dan menghindari semua masalah yang datang dengan pemrograman multi-utas.
Jacques
Maaf untuk menghidupkan kembali ini nanti, tetapi jika saya menelurkan panggilan metode dengan performSelector: withObject: afterDelay apakah saya masih perlu menggunakan NSAutoReleasePool di dalam metode async? Jika secara ajaib menggunakan kumpulan rilis otomatis utama maka performSElector: afterDelay jelas merupakan opsi yang lebih cepat.
Mike S
Tidak, karena metode ini dijalankan di thread utama, yang memiliki kumpulan rilis otomatisnya sendiri.
Jacques
4
@Joe Beresiko mengatakan sesuatu yang sudah Anda ketahui, Anda tidak boleh membiasakan diri menulis kode yang membunuh utas, itu tidak akan membantu Anda atau karier Anda dalam jangka panjang. Lihat posting ini (atau banyak yang menyukainya) untuk alasan mengapa tidak mematikan utas.
MikeC
1

Cara terbaik untuk multithreading di iOS menggunakan 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
    });
});
Kusal Shrestha
sumber
0

Saya akan mencoba semua teknik yang telah diposting orang dan melihat mana yang tercepat, tetapi menurut saya ini adalah cara terbaik untuk melakukannya.

[self performSelectorInBackground:@selector(BackgroundMethod) withObject:nil];
Polisi
sumber
ini meluncurkan utas dengan prioritas rendah. Menggunakan gcd adalah cara terbaik untuk threading.
Karsten