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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top