2010-10-06 12 views
91

Jaki jest najlepszy sposób uruchomienia kodu w osobnym wątku? To jest:iphone ios działa w oddzielnym wątku

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

Lub:

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

Robiłem drugi sposób ale Wesley Cookbook Czytałem wykorzystuje pierwszy.

Odpowiedz

237

Moim zdaniem najlepszym sposobem jest libdispatch, czyli Grand Central Dispatch (GCD). Ogranicza się do systemu iOS 4 i nowszego, ale jest tak prosty i łatwy w użyciu. Kod zrobić niektóre przetwarzania na wątek tła, a następnie zrobić coś z wynikami w pętli głównej run jest bardzo prosta i zwarta:

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

Jeżeli nie zostało to zrobione, sprawdź filmy z WWDC 2010 na libdispatch/GCD/blocks.

+0

muszę go mieć 3.0 kompatybilny :( –

+1

Następnie kolejki pracy są prawdopodobnie następnej najlepszym rozwiązaniem. Ponadto, upewnij się, że nie jesteś nurkowanie w współbieżności zbyt szybko. Spróbuj uruchomić pisząc rzeczy jedno- W przypadku wątków i profilów sprawdź, czy potrzebujesz wielowątkowych, czy możesz zaprojektować swój kod z pojedynczym gwintem, aby był bardziej efektywny. Dla prostych zadań możesz czasami zrobić wszystko, czego potrzebujesz z performSelector: withObject: afterDelay: i unikać wszystkie problemy związane z programowaniem wielowątkowym – Jacques

+0

Przepraszam, że wskrzesiłem to znacznie później, ale jeśli odradzam wywołanie metody z performSelector: withObject: afterDelay czy nadal muszę używać NSAutoReleasePool wewnątrz metody asynchronicznej? t magicznie wykorzystuje główną pulę wydań automatycznych, a następnie performSElector: afterDelay jest zdecydowanie szybszą opcją. –

1

Najlepszy sposób na wielowątkowość w iOS wykorzystuje 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 
    }); 
}); 
+3

Czy nie przeczytałeś innych odpowiedzi? –

0

Chciałbym wypróbować wszystkie techniki, które ludzie napisali i zobaczyć, który jest najszybszy, ale myślę, że jest to najlepszy sposób, aby to zrobić.

[self performSelectorInBackground:@selector(BackgroundMethod) withObject:nil]; 
Powiązane problemy