cari

Rumah  >  Soal Jawab  >  teks badan

objective-c - ios开发验证码倒计时60s,真机测试退到后台,再次打开发现秒数没有变化,怎么办?

__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);
PHPzPHPz2889 hari yang lalu420

membalas semua(7)saya akan balas

  • 天蓬老师

    天蓬老师2017-04-17 17:53:26

    Tamatkan urutan apabila meninggalkan halaman semasa, dan kemudian mulakan kira detik hingga 60

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:53:26

    Pemasa perlu dijalankan dalam Runloop

    balas
    0
  • 怪我咯

    怪我咯2017-04-17 17:53:26

    Selepas anda pergi ke latar belakang, jika anda tidak diisytiharkan sebagai program yang boleh berjalan di latar belakang, NSTimer tidak sepatutnya hilang.
    Jika saya:
    1. Hentikan Pemasa sebelum memasuki latar belakang, rekod masa dalam applicationDidEnterBackground of appdelegate, bandingkan masa apabila memasuki latar depan, kira perbezaan, muat semula paparan nilai kod pengesahan dan kemudian mulakan Pemasa .
    2. Hentikan Pemasa sebelum memasuki latar belakang, atau gunakan backgroundTask untuk mengurangkan nombor kod pengesahan setiap beberapa saat di latar belakang, kembali ke meja depan, dan kemudian mulakan Pemasa. (Ini sangat membosankan...)
    3. Isytiharkan Apl anda sebagai program yang boleh berjalan di latar belakang.
    Saya akan memilih pilihan pertama. . .

    balas
    0
  • PHP中文网

    PHP中文网2017-04-17 17:53:26

    Pelan saya adalah seperti berikut:

    1. Rekod masa mula.

    2. Mengemas kini paparan pada antara muka setiap saat, gunakan 当前时间 - 开始时间 untuk mendapatkan bilangan saat yang dipaparkan pada antara muka

    3. Saya menggunakan GCD Timer, dan tidak perlu mengendalikan situasi apabila memasuki latar belakang dan kemudian kembali ke hadapan Sudah tentu, tidak ada masalah untuk menggunakan yang lain.

    balas
    0
  • PHPz

    PHPz2017-04-17 17:53:26

    Anda boleh mencuba penyelesaian berikut.

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

    balas
    0
  • 大家讲道理

    大家讲道理2017-04-17 17:53:26

    GreedTimer boleh menyelesaikan masalah yang anda nyatakan. Apabila menggunakan GRTimer, tetapkan timeInBackground kepada YES

    balas
    0
  • ringa_lee

    ringa_lee2017-04-17 17:53:26

    Tiada satu pun kaedah yang dinyatakan di atas berfungsi.

    http://www.jianshu.com/p/8e61...

    balas
    0
  • Batalbalas