76 votes

Comment créer un NSTimer sur un thread d'arrière-plan ?

J'ai une tâche qui doit être effectuée toutes les 1 seconde. Actuellement, j'ai un NSTimer qui tire à plusieurs reprises toutes les 1 seconde. Comment faire en sorte que le minuteur se déclenche dans un thread d'arrière-plan (non UI-thread) ?

Je pourrais faire en sorte que le NSTimer se déclenche sur le thread principal, puis utiliser NSBlockOperation pour envoyer un thread d'arrière-plan, mais je me demande s'il existe un moyen plus efficace de le faire.

18voto

nacho4d Points 12879

ça devrait marcher,

Il répète une méthode toutes les 1 seconde dans une file d'attente en arrière-plan sans utiliser NSTimers :)

 - (void)methodToRepeatEveryOneSecond
{
    // Do your thing here

    // Call this method again using GCD 
    dispatch_queue_t q_background = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
    double delayInSeconds = 1.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, q_background, ^(void){
        [self methodToRepeatEveryOneSecond];
    });
}

Si vous êtes dans la file d'attente principale et que vous souhaitez appeler la méthode ci-dessus, vous pouvez le faire pour qu'elle se transforme en file d'attente d'arrière-plan avant d'être exécutée :)

 dispatch_queue_t q_background = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_async(q_background, ^{
    [self methodToRepeatEveryOneSecond];
});

J'espère que ça aide

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X