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

__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

学习是最好的投资!

membalas semua(7)
Peter_Zhu

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

伊谢尔伦

Pemasa perlu dijalankan dalam Runloop

刘奇

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

洪涛

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.

PHPzhong

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;
  });
大家讲道理

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

左手右手慢动作

Tiada satu pun kaedah yang dinyatakan di atas berfungsi.

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan