GCDTimer

#import 

@interface PQTimer : NSObject

/**
 创建一个定时器

 @param time 多少秒运行一次
 @param beginTime 开始时间
 @param complete 回调 在回调中如果返回 YES 会停止计时 返回 NO 继续执行
 @return 对象
 */
+ (PQTimer*)timerWithTimeInterval:(NSTimeInterval)time beginTime:(NSTimeInterval)beginTime complete:(BOOL(^)())complete;

- (void)stopTimer;
- (void)satrtTimer;
@end

.m

#import "PQTimer.h"

@interface PQTimer ()

@property (nonatomic, strong) dispatch_source_t time;

@end

@implementation PQTimer

+ (PQTimer*)timerWithTimeInterval:(NSTimeInterval)time beginTime:(NSTimeInterval)beginTime complete:(BOOL(^)())complete{
    PQTimer * timer = [[PQTimer alloc] init];
    //获得队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    //创建一个定时器
    timer.time = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    //设置开始时间
    dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(beginTime * NSEC_PER_SEC));
    //设置时间间隔
    uint64_t interval = (uint64_t)(time * NSEC_PER_SEC);
    //设置定时器
    dispatch_source_set_timer(timer.time, start, interval, 0);
    //设置回调
    dispatch_source_set_event_handler(timer.time, ^{
        
        dispatch_async(dispatch_get_main_queue(), ^{
            BOOL isStop = complete();
            if (isStop) {
                dispatch_source_cancel(timer.time);
            }
        });
        
    });
    //由于定时器默认是暂停的所以我们启动一下
    //启动定时器
    dispatch_resume(timer.time);
    return timer;
}

- (void)stopTimer{
        dispatch_resume(self.time);
    dispatch_source_cancel(self.time);
}


- (void)satrtTimer{
    dispatch_resume(self.time);
}

//这里用于暂停定时器,但是需要注意的是暂停之后不能调用停止定时器的方法,会crash,如果想调用应该先resume定时器,在销毁
- (void)pauseTimer{//挂起之后无法被销毁
    dispatch_suspend(self.time);
}

@end

你可能感兴趣的:(GCDTimer)