Преобразование неосновных задач runloop в GCD - PullRequest
3 голосов
/ 26 декабря 2010

У меня есть задача, которая запускается периодически, и изначально она была разработана для запуска в отдельном цикле выполнения, а не в главном цикле выполнения с использованием NSThread и NSTimer.

Каков наилучший способ адаптировать это для использования преимуществ GCD?

Текущий код:

-(void)initiateSomeTask
{
    [NSThread detachNewThreadSelector:@selector(startTimerTask) 
            toTarget:self withObject:nil];
}

-(void)startTimerTask
{
    // We won't get back the main runloop since we're on a new thread 
    NSRunLoop *myRunLoop = [NSRunLoop currentRunLoop]; 

    NSPort *myPort = [NSMachPort port];
    [myRunLoop addPort:myPort forMode:NSDefaultRunLoopMode];

    NSTimer *myTimer = [NSTimer timerWithTimeInterval:10 /* seconds */ 
            target:self selector:@selector(doMyTaskMethod) 
            userInfo:nil repeats:YES];

    [myRunLoop addTimer:myTimer forMode:NSRunLoopCommonModes];
    [myRunLoop run];
}

Могу ли я что-нибудь сделать, кроме замены detachNewThreadSelector на dispatch_async?

1 Ответ

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

Вы можете заменить использование NSTimer на dispatch_source_create на DISPATCH_SOURCE_TYPE_TIMER.Тогда вам не понадобится цикл выполнения.

Вернемся к исходному случаю, однако вам не нужно создавать поток или использовать диспетчеризацию для запуска таймера.Суть циклов выполнения состоит в том, что вам не нужно создавать поток для выполнения чего-то простого, например, таймера.

...