iOS 單例計時器(頁面切換仍然計時)
//–––––––––––––––––––––單例.h––––––––––––––––––––––––
#import <Foundation/Foundation.h>
@interface CaptchaTimerManager :NSObject
@property (nonatomic,assign)__blockint timeout;
+ (id)sharedTimerManager;
- (void)countDown;
@end
//–––––––––––––––––––––單例.m––––––––––––––––––––––––
#import"CaptchaTimerManager.h"
@implementation CaptchaTimerManager
+ (id)sharedTimerManager{
staticCaptchaTimerManager *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
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);
}