iOS使用dispatch进行倒计时,使用NSTimer总是感觉有问题,不是在滑动的时候倒计时卡住不动了,就是scheduledTimerWithTimeInterval对iOS版本有要求,所以直接使用dispatch_source_set_timer的方式倒计时,刷新界面,测试是不会卡顿的。记录下,反正哪个方便用哪个,用的少,记下,方便下次要用的时候不知道怎么写了…
dispatch_queue_t queue;
dispatch_source_t timer;
// 开启倒计时效果
- (void)openCountdown:(NSTimeInterval)timeCount {
__weak typeof(self) selfWeak = self;
__block NSInteger time = timeCount; //倒计时时间
queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(timer,DISPATCH_TIME_NOW,1.0*NSEC_PER_SEC, 0); //每秒执行
dispatch_source_set_event_handler(timer, ^{
__weak typeof(self) selfWeakWeak = selfWeak;
if(time <= 0){ //倒计时结束,关闭
dispatch_source_cancel(self->timer);
dispatch_async(dispatch_get_main_queue(), ^{
[selfWeakWeak glHandleTimeCountFinish];
});
}else{
dispatch_async(dispatch_get_main_queue(), ^{
[selfWeakWeak glHandleTimeCountIng:time];
time--;
});
}
});
dispatch_resume(timer);
}
/// 倒计时结束处理界面
- (void)glHandleTimeCountFinish {
self.buttonAgreen.enabled = YES;
self.buttonCancel.enabled = YES;
self.titleLabel.text = self.contentTitleStr;
}
/// 倒计时进行中处理界面
- (void)glHandleTimeCountIng:(NSInteger)timeC {
self.buttonAgreen.enabled = NO;
self.buttonCancel.enabled = NO;
self.titleLabel.text = [self.contentTitleStr stringByAppendingFormat:@" (%lds)", (long)timeC];
}
- (void)dealloc {
if (timer) {
dispatch_source_cancel(timer);
timer = nil;
}
}