iOS 倒計時按鈕--- 程序進入后臺也會倒計時

Tip:這篇文章筆者還未接觸Markdown語言所做筆記。直接復制代碼請點擊->源代碼Copy不報錯



前言:前段時間,測試同事測試出一個問題。那就是手機號注冊碼發(fā)送以后,發(fā)送按鈕進入倒計時,而后將程序退入后臺,當過了5分鐘以后。NSTimer就顯示的時間沒有改變。還有一種不和邏輯的現(xiàn)象就是:時間會亂序。一會5s 一會7s. (-_-)當然了這個問題是我沒控制好NSTimer 的NSRunloop。 為了避免這種復雜的要注意點,我采用了GCD里邊的信號量來做倒計時按鈕。其一:在后臺也進程也不會中斷,會按照物理時間繼續(xù)減少秒數(shù)。其二:完全避免了會亂序的情況。 廢話不多說,上代碼。

?- (void)countDownBegin:(UIButton *)sender{ NSTimeInterval seconds =60; NSDate *endTime = [NSDate dateWithTimeIntervalSinceNow:seconds];// 最后期限 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); dispatch_source_t _sometimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,0,0, queue); dispatch_source_set_timer(_sometimer, dispatch_walltime(NULL,0),1.0*NSEC_PER_SEC,0);// 每秒執(zhí)行一次 dispatch_source_set_event_handler(_sometimer, ^{ int interval = [endTime timeIntervalSinceNow]; if(interval >0) {// 更新倒計時 NSString *timeStr = [NSString stringWithFormat:@"%ds", interval]; dispatch_async(dispatch_get_main_queue(), ^{ [sender setTitle:timeStr forState:UIControlStateNormal]; sender.userInteractionEnabled =NO; [sender setTitleColor:[UIColor grayColor] forState:UIControlStateNormal]; }); }else{ // 倒計時結束,關閉 dispatch_source_cancel(_sometimer); dispatch_async(dispatch_get_main_queue(), ^{ [sender setTitle:@"獲取驗證碼"forState:UIControlStateNormal]; [sender setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; sender.userInteractionEnabled =YES; }); } }); dispatch_resume(_sometimer); }?

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容