2009-05-28 13 views
9

Mam kilka wywołań metod tak:Jak utworzyć fragment kodu w osobnym wątku?

[self myFoo]; 
[self heavyStuff]; // this one in other thread 
[self myBar]; 

które klasy/metody mam patrzeć? Kiedy szukam "wątku", pojawia się wiele klas, metod i funkcji. Które są najbardziej odpowiednie tutaj?

Odpowiedz

20

Można by zrobić

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

Zobacz NSObject reference na stronie Apple.

4

Można użyć NSOperationQueue i NSInvocationOperation:

[self myFoo]; 

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self                 selector:@selector(heavyStuff) object:nil]; 
[operationQueue addOperation:operation]; 

[self myBar]; 
15

Dla "ogniem i zapomnij", spróbuj [self performSelectorInBackground:@selector(heavyStuff) withObject:nil]. Jeśli masz więcej niż jedną operację takiego, może chcesz sprawdzić NSOperation i jej podklasy NSInvocationOperation. NSOperationQueue udało łączenie nici, liczba jednocześnie wykonywania operacji i zawiera informację, czy blokujących metod powiedzieć, kiedy wszystkie operacje zakończone:

[self myFoo]; 

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self                                 selector:@selector(heavyStuff) object:nil]; 

[operationQueue addOperation:operation]; 
[operation release]; 

[self myBar]; 

... 

[operationQueue waitUntilAllOperationsAreFinished]; //if you need to block until operations are finished 

Na niższym poziomie, można użyć wykorzystanie -[NSThread detachNewThreadSelector:@selector(heavyStuff) toTarget:self withObject:nil].

+0

brakuje a 'g' w performSelectorInBackround – Erich

+0

stałe. dzięki @Erich. –

7

Masz wiele wspaniałych wskazówek tutaj, ale nie zapomnij, aby spędzić trochę czasu z Threading Programming Guide. Zapewnia dobre wskazówki nie tylko w zakresie technologii, ale także dobrego projektowania współbieżnego przetwarzania i lepszego wykorzystania pętli uruchamiania zarówno z wątkami, jak i wątkami.

7

Jeśli kierujesz się wyłącznie Snow Leopard, można użyć Grand Central Dispatch:

[self myFoo]; 
dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
    [self heavyStuff]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self myBar]; 
    }); 
}); 

Ale to nie będzie działać na starszych systemach (lub iPhone) i to chyba przesada.

EDYCJA: Działa na iPhone od iOS 4.x.

+0

NSOperation wykorzystuje również GCD w Snow Leopard i zawiera podklasy NSBlockOperation więc można użyć bloków z nim. – Chuck

Powiązane problemy