GCD
定时器相比NSTimer
可以忽略 Runloop
带来的问题,同时也更加精确。
封装如下
#import <Foundation/Foundation.h>
@interface GCDTimer : NSObject
//新建 timer
+ (dispatch_source_t )timerWithTimeInterval:(NSTimeInterval)timeInterval
delay:(NSTimeInterval)delay
block:(void(^)(id timer))block;
//开启
+ (void)startWithTimer:(dispatch_source_t)timer;
//取消
+ (void)cancelWithTimer:(dispatch_source_t)timer;
//暂停
+ (void)pauseWithTimer:(dispatch_source_t)timer;
@end
#import "GCDTimer.h"
@interface GCDTimer()
//@property (nonatomic, strong) dispatch_source_t timer;
@end
@implementation GCDTimer
+ (dispatch_source_t )timerWithTimeInterval:(NSTimeInterval)timeInterval
delay:(NSTimeInterval)delay
block:(void (^)(id))block{
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC));
uint64_t interval = (uint64_t)(timeInterval * NSEC_PER_SEC);
dispatch_source_set_timer(timer, start, interval, 0);
dispatch_source_set_event_handler(timer, ^{
if(block){
block(timer);
}
});
return timer;
}
+ (void)startWithTimer:(dispatch_source_t)timer{
if(timer){
dispatch_resume(timer);
}
}
+ (void)pauseWithTimer:(dispatch_source_t)timer{
if(timer){
dispatch_suspend(timer);
}
}
+ (void)cancelWithTimer:(dispatch_source_t)timer{
if(timer){
dispatch_cancel(timer);
}
}
@end
使用
- (void)viewDidLoad {
[super viewDidLoad];
__block NSInteger i = 0;
dispatch_source_t timer = [GCDTimer timerWithTimeInterval:1
delay:0
block:^(id timer) {
i+=1;
NSLog(@"** %ld **",i);
if(i==20){
[GCDTimer cancelWithTimer:timer];
}
}];
[GCDTimer startWithTimer:timer];
}
如有不正确的地方,还请各位多多指教。
网友评论