iOS 单例计时器(页面切换仍然计时)
iOS 单例计时器(页面切换仍然计时) NSTimer 定时器(2) GCD 多线程(4)
//–––––––––––––––––––––单例.h––––––––––––––––––––––––
#import
@interface CaptchaTimerManager :NSObject
@property (nonatomic,assign)__blockint timeout;
+ (id)sharedTimerManager;
- (void)countDown;
@end
//–––––––––––––––––––––单例.m––––––––––––––––––––––––
#import"CaptchaTimerManager.h"
@implementation CaptchaTimerManager
+ (id)sharedTimerManager{
static CaptchaTimerManager *manager =nil;
staticdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (manager ==nil) {
manager = [[selfalloc]init];
}
});
return manager;
}
- (void)countDown{
if (_timeout >0) {
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);
}else{
_timeout--;
}
});
dispatch_resume(_timer);
}
}
@end
//–––––––––––––––––––––调用––––––––––––––––––––––––
#import "CaptchaTimerManager.h"
@property (weak,nonatomic) IBOutletUIButton *getNUmber;
@property (nonatomic,assign) int timeout;
- (IBAction)getNumberButton:(UIButton *)sender {
_getNUmber.enabled =NO;
_timeout =10; //倒计时时间
[selftimerCountDown];
}
-(void)viewWillAppear:(BOOL)animated{
CaptchaTimerManager *manager = [CaptchaTimerManagersharedTimerManager];
int temp = manager.timeout;
if (temp >0) {
_timeout= temp;//倒计时时间
_getNUmber.enabled =NO;
[selftimerCountDown];
}else{
_getNUmber.enabled =YES;
}
}
- (void)viewWillDisappear:(BOOL)animated{
[superviewWillDisappear:animated];
if (self.timeout >0) {
CaptchaTimerManager *manager = [CaptchaTimerManagersharedTimerManager];
if (manager.timeout ==0) {
manager.timeout =_timeout;
[manager countDown];
}
_timeout = 0;//置为0,释放controller
}
}
//控制器里的计时器
- (void)timerCountDown {
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(), ^{
//这里写倒计时结束button的处理
});
}else{
dispatch_async(dispatch_get_main_queue(), ^{
//这里写倒计时期间button的处理(重设button的tiitle、用户交互等)
if (_timeout==1) {
self.title =@"输入手机号";
_getNUmber.enabled =YES;
} else {
self.title = [NSStringstringWithFormat:@"%d",_timeout];
}
});
_timeout--;
}
});
dispatch_resume(_timer);
}