La conversión de las tareas no principales Runloop a GCD
-
13-10-2019 - |
Pregunta
I tiene una tarea que ejecuta periódicamente y que fue diseñado originalmente para ejecutarse en un bucle de ejecución separada de la runloop principal usando NSThread y NSTimer.
¿Cuál es la mejor manera de adaptar este para tomar ventaja de GCD?
código actual:
-(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];
}
¿Hay algo que pueda hacer, además de reemplazar detachNewThreadSelector
con dispatch_async
?
Solución
Se puede reemplazar el uso de NSTimer con el uso de dispatch_source_create con DISPATCH_SOURCE_TYPE_TIMER. No se necesita un bucle de ejecución a continuación.
De vuelta en el caso original, sin embargo, usted realmente no necesita para hacer un despacho o uso de hilo para ejecutar un temporizador. Una especie de punto de hacer loops es que no es necesario para hacer un hilo que hacer algo tan sencillo como un temporizador.