iphone ios ayrı iş parçacığında çalışıyor


96

Kodu ayrı bir iş parçacığı üzerinde çalıştırmanın en iyi yolu nedir? Bu mu:

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

Veya:

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

Ben ikinci yolu yapıyorum ama okuduğum Wesley Yemek Kitabı ilkini kullanıyor.

Yanıtlar:


244

Bence en iyi yol libdispatch, yani Grand Central Dispatch (GCD). Sizi iOS 4 ve üstü ile sınırlar, ancak çok basit ve kullanımı kolaydır. Bir arka plan iş parçacığı üzerinde biraz işlem yapmak ve ardından ana çalıştırma döngüsündeki sonuçlarla bir şeyler yapmak için kod inanılmaz derecede kolay ve kompakttır:

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

Henüz yapmadıysanız, WWDC 2010'daki libdispatch / GCD / bloklardaki videolara bakın.


3.0 ile uyumlu olması gerekiyor :(
Mike S

1
O halde operasyon kuyrukları muhtemelen bir sonraki en iyi çözümdür. Ayrıca, eşzamanlılığa çok hızlı dalmadığınızdan emin olun. Çok iş parçacıklı gitmeniz gerekip gerekmediğini görmek için tek iş parçacıklı ve profil yazarak başlayın veya tek iş parçacıklı kodunuzu kendi başına daha verimli olacak şekilde tasarlayabilir misiniz? Basit görevler için bazen performSelector: withObject: afterDelay: ile ihtiyacınız olan her şeyi yapabilir ve çok iş parçacıklı programlamayla gelen tüm sorunları önleyebilirsiniz.
Jacques

Bunu daha sonra dirilttiğim için üzgünüm, ancak performSelector: withObject: afterDelay ile bir yöntem çağrısı oluşturursam, eşzamansız yöntem içinde yine de bir NSAutoReleasePool kullanmam gerekir mi? Ana otomatik yayın havuzunu sihirli bir şekilde kullanıyorsa, performSElector: afterDelay kesinlikle daha hızlı bir seçenektir.
Mike S

Hayır, çünkü yöntem, kendi otomatik yayın havuzuna sahip ana iş parçacığı üzerinde çalıştırılıyor.
Jacques

4
@Joe Zaten bildiğiniz bir şeyi söyleme riski altında, konuları öldüren kod yazma alışkanlığı edinmemelisiniz, bu uzun vadede size veya kariyerinize yardımcı olmayacaktır. Bkz Bu yayını konuları öldürmek için değil niçin nedenlerle (veya bunun gibi birçok).
MikeC

1

İOS'ta çoklu okuma için en iyi yol GCD (Grand Central Dispatch) kullanmaktır.

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

0

İnsanların yayınladığı tüm teknikleri deneyip hangisinin en hızlı olduğunu görüyorum, ama bence bunu yapmanın en iyi yolu bu.

[self performSelectorInBackground:@selector(BackgroundMethod) withObject:nil];

bu, iş parçacığını düşük bir öncelikte başlatır. Gcd kullanmak, diş açmanın en iyi yoludur.
Karsten

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.