__block int timeout=60;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
dispatch_source_set_event_handler(_timer, ^{
if(timeout<=0){
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
[self.validBtn setTitle:@"获取短信验证码" forState:UIControlStateNormal];
//self.validBtn.backgroundColor=RGB(120, 0, 103);
[self.validBtn setBackgroundImage:[UIImage imageNamed:@"获取验证码"] forState:UIControlStateNormal];
self.validBtn.userInteractionEnabled = YES;
});
}else{
int seconds = timeout;
NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds];
dispatch_async(dispatch_get_main_queue(), ^{
[self.validBtn setTitle:[NSString stringWithFormat:@"%@秒",strTime] forState:UIControlStateNormal];
//self.validBtn.backgroundColor=RGB(207, 207, 207);
[self.validBtn setBackgroundImage:[UIImage imageNamed:@"获取验证码-不可点击"] forState:UIControlStateNormal];
self.validBtn.userInteractionEnabled = NO;
});
timeout--;
}
});
dispatch_resume(_timer);
Terminez le fil de discussion en quittant la page en cours, puis initialisez le compte à rebours à 60
La minuterie doit s'exécuter dans Runloop
Après être passé en arrière-plan, si vous n'êtes pas déclaré comme programme pouvant s'exécuter en arrière-plan, NSTimer ne devrait pas disparaître.
Si c'était moi :
1. Arrêtez le minuteur avant d'entrer en arrière-plan, enregistrez l'heure dans l'applicationDidEnterBackground du délégué d'application, comparez l'heure lors de l'entrée au premier plan, calculez la différence, actualisez l'affichage de la valeur du code de vérification, puis démarrez la minuterie.
2. Arrêtez le minuteur avant d'entrer en arrière-plan, ou utilisez backgroundTask pour décrémenter le numéro de code de vérification toutes les quelques secondes en arrière-plan, retournez à la réception, puis démarrez le minuteur. (C'est tellement ennuyeux...)
3. Déclarez votre application comme un programme pouvant s'exécuter en arrière-plan.
Je choisirais la première option. . .
Mon plan est le suivant :
Enregistrer l'heure de début.
Mise à jour l'affichage sur l'interface toutes les secondes, utilisez
当前时间 - 开始时间
pour obtenir le nombre de secondes affichées sur l'interfaceJ'utilise
GCD Timer
, et il n'est pas nécessaire de gérer la situation en entrant en arrière-plan puis en revenant au premier plan. Bien sûr, ce n'est pas un problème d'en utiliser d'autres.Vous pouvez essayer la solution suivante.
GreedTimer peut résoudre le problème que vous avez mentionné. Lorsque vous utilisez GRTimer, réglez
timeInBackground
surYES
Aucune des méthodes mentionnées ci-dessus ne fonctionne. J'en ai trouvé une simple et réalisable.
http://www.jianshu.com/p/8e61...