Преобразование неосновных задач runloop в GCD


У меня есть задача, которая выполняется периодически, и она изначально была разработана для запуска на отдельном цикле запуска, чем основной runloop с использованием 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 3

1 ответ:

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

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