Obecnie używam NSThread
do buforowania zdjęć w innym wątku.NSThread vs. NSOperationQueue vs. ??? na iPhonie
[NSThread detachNewThreadSelector:@selector(cacheImage:) toTarget:self withObject:image];
Alternatywnie:
[self performSelectorInBackground:@selector(cacheImage:) withObject:image];
Alternatywnie, można użyć NSOperationQueue
NSInvocationOperation *invOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(cacheImage:) object:image];
NSOperationQueue *opQueue = [[NSOperationQueue alloc] init];
[opQueue addOperation:invOperation];
Czy jest jakiś powód, aby przełączyć się z dala od NSThread
? GCD jest czwartą opcją, gdy jest wydany na iPhone'a, ale jeśli nie ma znaczącego wzrostu wydajności, wolałbym trzymać się metod, które działają na większości platform.
oparciu o poradę @ Jon-Eric, poszedłem z NSOperationQueue
/NSOperation
rozwiązania podklasy. Pracuje bardzo dobrze. Klasa NSOperation
jest na tyle elastyczna, że można jej używać z inwokacjami, blokami lub niestandardowymi podklasami, w zależności od potrzeb. Bez względu na to, jak utworzysz swój NSOperation
, możesz po prostu rzucić go do kolejki operacji, kiedy będziesz gotowy do uruchomienia. Operacje są zaprojektowane tak, aby działały jako obiekty umieszczane w kolejce lub można je uruchomić jako autonomiczne metody asynchroniczne, jeśli chcesz. Ponieważ możesz łatwo uruchomić swoje niestandardowe metody działania synchronicznie, testowanie jest banalnie łatwe.
Użyłem tej samej techniki w kilku projektach, ponieważ zadałem to pytanie i nie mogłem być bardziej zadowolony ze sposobu, w jaki mój kod i testy są czyste, uporządkowane i szczęśliwie asynchroniczne.
++++++++++ Czy podklasy ponownie
Możesz profilować każdy z nich. To byłby jeden sposób, aby się dowiedzieć. –
Wydajność była złym słowem, podejrzewam, że pod spodem są takie same. Bardziej szukam kogoś, kto ma doświadczenie z dwoma lub więcej z tych metod, aby dać mi kilka porad na temat preferowanego sposobu i dlaczego jest lepszy. – kubi