Как я могу заставить кусок кода работать в отдельном потоке? - PullRequest
9 голосов
/ 29 мая 2009

У меня есть несколько вызовов методов, таких как:

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

на какие классы / методы мне нужно смотреть? Когда я ищу «поток», появляется много классов, методов и функций. Какие из них являются наиболее подходящими здесь?

Ответы [ 5 ]

20 голосов
/ 29 мая 2009

Вы бы сделали

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

См. Ссылку NSObject на сайте Apple.

15 голосов
/ 29 мая 2009

Для «огонь и забудь» попробуйте [self performSelectorInBackground:@selector(heavyStuff) withObject:nil]. Если у вас есть более одной подобной операции, вы можете проверить NSOperation и его подкласс NSInvocationOperation. NSOperationQueue управляемый пул потоков, количество одновременно выполняемых операций и включает уведомления или методы блокировки, чтобы сообщить вам, когда все операции завершены:

[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

На более низком уровне вы можете использовать -[NSThread detachNewThreadSelector:@selector(heavyStuff) toTarget:self withObject:nil].

7 голосов
/ 23 декабря 2009

Если вы нацелены исключительно на Snow Leopard, вы можете использовать Grand Central Dispatch:

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

Но он не будет работать на более ранних системах (или iPhone) и, вероятно, излишним.

РЕДАКТИРОВАТЬ : работает на iPhone начиная с iOS 4.x.

7 голосов
/ 29 мая 2009

У вас здесь много отличных указателей, но не забудьте потратить некоторое время на Руководство по программированию потоков . Он дает хорошее руководство не только по технологиям, но и по хорошему дизайну параллельной обработки, а также по тому, как лучше использовать цикл выполнения как с потоками, так и вместо потоков.

4 голосов
/ 29 мая 2009

Вы можете использовать NSOperationQueue и NSInvocationOperation:

[self myFoo];

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

[self myBar];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...