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