Question

J'ai une tâche qui exécute périodiquement et il a été initialement conçu pour fonctionner sur une boucle d'exécution séparée que la principale runloop utilisant NSThread et NSTimer.

Quelle est la meilleure façon d'adapter ce à tirer profit de GCD?

Code actuel:

-(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];
}

Est-ce que je peux faire en plus de remplacer detachNewThreadSelector avec dispatch_async?

Était-ce utile?

La solution

Vous pouvez remplacer l'utilisation de NSTimer avec l'utilisation de dispatch_source_create avec DISPATCH_SOURCE_TYPE_TIMER. Vous ne aurez pas besoin d'une boucle d'exécution alors.

Retour dans le cas original, cependant, vous n'avez pas vraiment besoin de faire une dépêche de fil ou utiliser pour exécuter une minuterie. Sorte de point de boucles RUN est que vous n'avez pas besoin de faire un fil pour faire quelque chose simple comme une minuterie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top