1.關于GCD倒計時,實際開發(fā)中遇到的問題在于線程使用,要知道倒計時每次改變都是在主線程對按鈕的UI進行重新繪制,所以必須保證倒計時按鈕變化的通知,其他操作要在其他線程,否則,頁面卡死,卡頓將會出現(xiàn)
2.一般用到倒計時,大多是在收取驗證碼,當收到驗證碼,填寫完畢的時候,點擊進行其他操作,必須殺死/停止當前線程,否則只能等到倒計時為0方可進行,道理就是如1所描述
demo演示
核心代碼
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,strong) id timer;
@property (weak, nonatomic) IBOutlet UIButton *startButton;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
/***********
1.關于GCD倒計時,實際開發(fā)中遇到的問題在于線程使用,要知道倒計時每次改變都是在主線程對按鈕的UI進行重新繪制,所以必須保證倒計時按鈕變化的通知,其他操作要在其他線程,否則,頁面卡死,卡頓將會出現(xiàn)
2.一般用到倒計時,大多是在收取驗證碼,當收到驗證碼,填寫完畢的時候,點擊進行其他操作,必須殺死/停止當前線程,否則只能等到倒計時為0方可進行,道理就是如1所描述
**********/
[_startButton setTitle:@"獲取驗證碼" forState:UIControlStateNormal];
}
/**
GCD開始倒計時
@param sender <#sender description#>
*/
- (IBAction)start:(id)sender {
__block NSInteger second = 60;
//全局隊列 默認優(yōu)先級
dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//定時器模式 事件源
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, quene);
_timer = timer;
//NSEC_PER_SEC是秒代咸,*1是每秒
dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), NSEC_PER_SEC * 1, 0);
//設置響應dispatch源事件的block衩侥,在dispatch源指定的隊列上運行
dispatch_source_set_event_handler(timer, ^{
//回調(diào)主線程,在主線程中操作UI
dispatch_async(dispatch_get_main_queue(), ^{
if (second >= 0) {
[_startButton setTitle:[NSString stringWithFormat:@"(%ld)重發(fā)驗證碼",second] forState:UIControlStateNormal];
second--;
}
else
{
//這句話必須寫否則會出問題
dispatch_source_cancel(timer);
[_startButton setTitle:@"獲取驗證碼" forState:UIControlStateNormal];
}
});
});
//啟動源
dispatch_resume(timer);
}
/**
GCD停止計時
@param sender <#sender description#>
*/
- (IBAction)stop:(id)sender {
dispatch_source_cancel(_timer) ;
}
demo下載:https://github.com/OwenJoe/countDown
參考文章:http://blog.csdn.net/codingfire/article/details/52329856