2015-07-30 2 views
0

Dans mon application iOS, j'utilise GCD comme minuteur exécuté sur un thread d'arrière-plan. Voici mon code:Quand la minuterie est-elle déclenchée

dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)); 
double interval = 1.0; 
dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, 0); 
uint64_t intervalTime = (int64_t)(interval * NSEC_PER_SEC); 
dispatch_source_set_timer(timer, startTime, intervalTime, 0); 

dispatch_source_set_event_handler(timer, ^{ 
    // some code 
}); 

// start timer 
dispatch_resume(timer); 

Je me demande quand le code à l'intérieur du bloc est appelé. Il est appelé chaque seconde (il peut arriver qu'il soit appelé même si l'appel précédent n'est pas encore terminé) ou il est appelé après une seconde à la fin de l'appel précédent?

Répondre

0

dispatch_after works tout comme un dispatch_async retardé. Vous n'avez toujours aucun contrôle sur l'heure réelle d'exécution et vous ne pouvez pas l'annuler une fois que dispatch_after retourne. Vous vous demandez s'il est approprié d'utiliser dispatch_after?

Queue personnalisée série: Soyez prudent lorsque vous utilisez dispatch_after sur une file d'attente personnalisée série. Tu ferais mieux de rester dans la file d'attente principale.

File d'attente principale (série): C'est un bon choix pour dispatch_after; Xcode a un joli modèle de saisie semi-automatique pour cela.

File d'attente simultanée: Soyez prudent lorsque vous utilisez dispatch_after sur des files d'attente simultanées personnalisées; c'est rare que tu fasses ça. Stick à la file d'attente principale pour ces opérations.

Passez par This documentation pour plus de détails