objective-c - ios开发验证码倒计时60s,真机测试退到后台,再次打开发现秒数没有变化,怎么办?
PHPz
PHPz 2017-04-17 17:51:26
0
7
415

__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);
PHPz
PHPz

学习是最好的投资!

répondre à tous(7)
Peter_Zhu

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 :

  1. Enregistrer l'heure de début.

  2. Mise à jour l'affichage sur l'interface toutes les secondes, utilisez 当前时间 - 开始时间 pour obtenir le nombre de secondes affichées sur l'interface

  3. J'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.

PHPzhong

Vous pouvez essayer la solution suivante.

  __block long totalComplete = 0;
  dispatch_source_set_event_handler(source, ^{
    long value = dispatch_source_get_data(source);
    totalComplete += value;
    self.progressView.progress = (CGFloat)totalComplete/100.0f;
  });
大家讲道理

GreedTimer peut résoudre le problème que vous avez mentionné. Lorsque vous utilisez GRTimer, réglez timeInBackground sur YES

左手右手慢动作

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...

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal