__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);
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:
Rekod masa mula.
Mengemas kini paparan pada antara muka setiap saat, gunakan
当前时间 - 开始时间
untuk mendapatkan bilangan saat yang dipaparkan pada antara mukaSaya 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.Anda boleh mencuba penyelesaian berikut.
GreedTimer boleh menyelesaikan masalah yang anda nyatakan. Apabila menggunakan GRTimer, tetapkan
timeInBackground
kepadaYES
Tiada satu pun kaedah yang dinyatakan di atas berfungsi.
http://www.jianshu.com/p/8e61...