Преобразование неосновных задач 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 ответ:
Вы можете заменить использование NSTimer на использование dispatch_source_create с DISPATCH_SOURCE_TYPE_TIMER. Тогда вам не понадобится цикл запуска.
Обратно в оригинальный корпус, хотя, вы действительно не нужно, чтобы сделать какой-нить или воспользоваться диспетчерской, чтобы запустить таймер. Своего рода смысл циклов запуска заключается в том, что вам не нужно создавать поток, чтобы сделать что-то простое, например таймер.