вызов executeSelectorInBackground: из фонового потока - PullRequest
3 голосов
/ 12 декабря 2010

Каков реальный эффект вызова performSelectorInBackground:... из метода, который работает в фоновом режиме? Я хочу, чтобы он работал асинхронно

Например:

- (void) _imageBufferWasUpdated{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    //do something here

    if(shouldContinue){ 
        [self performSelectorInBackground:@selector(_loop) withObject:nil];
    }
    [pool release];
}

_imageBufferWasUpdated будет работать в фоновом режиме, и я хочу вызвать метод _loop асинхронно (в фоновом режиме также, так что _imageBufferWasUpdated скоро завершится, вероятно, до окончания _loop).

Это правильно?

Есть ли более эффективный (и относительно простой) способ сделать это с помощью GCD? Я был бы признателен, если бы вы могли привести пример того, как это можно сделать с помощью GCD. Я думаю, что мне нужно по крайней мере 3 потока, основной поток, фоновый поток для запуска _imageBufferWasUpdated и другой фоновый поток для _loop. Я прав?

Заранее спасибо Игнасио

Ответы [ 2 ]

2 голосов
/ 12 декабря 2010

То, что вы делаете, мне кажется нормальным.Какао, вероятно, использует один фоновый поток, поэтому это не должно приводить к чрезмерному созданию потока.

Если вы хотите больше контроля, вы можете использовать NSOperation или GCD.Оба довольно просты.Например, GCD будет такой

#import <dispatch/dispatch.h>

...

dispatch_async( dispatch_get_global_queue(0,0), ^{
    [self _loop];
}];
1 голос
/ 12 декабря 2010

executeSelectorInBackground разветвляет ваш селектор в фоновом потоке.[ документация ]

Я не знаю, прав ли я, но вы должны делать все, используя GCD или его классы высокого уровня (NSOperationQueue).Создание слишком большого количества фоновых потоков может привести к снижению производительности, если система насыщена слишком большим количеством потоков и не имеет достаточных вычислительных ресурсов

GCD автоматически управляет количеством одновременно работающих потоков на основе доступных системных ресурсов.

...