iOS 單例計(jì)時(shí)器(頁(yè)面切換仍然計(jì)時(shí))?NSTimer 定時(shí)器(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);?//每秒執(zhí)行
?dispatch_source_set_event_handler(_timer, ^{
?if(_timeout<=0){//倒計(jì)時(shí)結(jié)束,關(guān)閉
?dispatch_source_cancel(_timer);
? ? ? ? ? ? }else{
?_timeout--;
? ? ? ? ? ? }
? ? ? ? });
?dispatch_resume(_timer);
? ? }
}
@end
//–––––––––––––––––––––調(diào)用––––––––––––––––––––––––
#import?"CaptchaTimerManager.h"
@property?(weak,nonatomic)?IBOutletUIButton?*getNUmber;
@property?(nonatomic,assign)?int?timeout;
- (IBAction)getNumberButton:(UIButton?*)sender {
?_getNUmber.enabled?=NO;
?_timeout?=10;?//倒計(jì)時(shí)時(shí)間
? ? [selftimerCountDown];
}
-(void)viewWillAppear:(BOOL)animated{
?CaptchaTimerManager?*manager = [CaptchaTimerManagersharedTimerManager];
?int?temp = manager.timeout;
?if?(temp >0) {
?_timeout= temp;//倒計(jì)時(shí)時(shí)間
?_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
? ? }
}
//控制器里的計(jì)時(shí)器
- (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);?//每秒執(zhí)行
?dispatch_source_set_event_handler(_timer, ^{
?if(_timeout<=0){//倒計(jì)時(shí)結(jié)束,關(guān)閉
? ? ? ? ? ?dispatch_source_cancel(_timer);
? ? ? ? ? ?dispatch_async(dispatch_get_main_queue(), ^{
? ? ? ? ? ? ? ?//這里寫(xiě)倒計(jì)時(shí)結(jié)束button的處理
? ? ? ? ? ? });
? ? ? ? }else{
? ? ? ? ? ?dispatch_async(dispatch_get_main_queue(), ^{
? ? ? ? ? ? ? ?//這里寫(xiě)倒計(jì)時(shí)期間button的處理(重設(shè)button的tiitle、用戶交互等)
?if?(_timeout==1) {
?self.title?=@"輸入手機(jī)號(hào)";
?_getNUmber.enabled?=YES;
}?else?{
?self.title?= [NSStringstringWithFormat:@"%d",_timeout];
? ? ? ? ? ? ? ? }
? ? ? ? ? ? });
?_timeout--;
? ? ? ? }
? ? });
?dispatch_resume(_timer);
}