2016-01-18 1 views
2

Je lis un code, il vérifie les données et met à jour l'interface utilisateur toutes les secondes. Cela ressemble à ce que nous faisons habituellement en utilisant NSTimer scheduledtimerwithtimeinterval. Mais ce code est mis en œuvre avec l'appel dispatch_after comme récursive ceci:dispatch_after récursivité vs NSTimer scheduledtimerwithtimeinterval

- (void) retriggerMethod { 
    ... do stuff here, assuming you want to do it on first invocation ... 
    dispatch_after(..., ^{ 
     [self retriggerMethod]; 
    }); 
} 

Quelle est la différence entre dispatch_after récursion et NSTimer scheduledtimerwithtimeinterval? Y a-t-il un risque potentiel lors de l'utilisation du premier? Je pensais que quand vous l'utiliseriez, la pile d'appels augmenterait aussi longtemps que ne pas finir cette récursivité.

Répondre

5

NSTimer:

1. Need a NSRunloop. 
2. Can repeat. 
3. Can be invalid anytime if u want to cancel. 
4. Can only run with delegate. 
5. High level API. 

dispatch_after:

1. Can be run everywhere that u want with dispatch_queue. 
2. Can't repeat by itself. 
3. Can't be cancel. 
4. It run as block. 
5. GCD. 
3

En fait, vous n'avez pas récursion dans votre code. L'utilisation de dispatch_after dans votre cas se comporte comme si vous utilisiez un NSTimer.

Avec dispatch_after, l'appel suivant à votre retriggerMethod provient de GCD qui exécute le bloc mis en file d'attente. Donc, vous n'avez pas d'appel dans un appel - pas de récursion ici. Donc, en termes de récursivité, il n'y a pas de risque. Bien que dans ce cas, il semble plus raisonnable d'utiliser un NSTimer qui serait plus facile à annuler si nécessaire.