iOS

dispatch_source_t之Timer

2017-06-07  本文已影响23人  和谐共处

dispatch_source_t之Timer

/**
 1.注意:timer必须是全局变量或者静态变量,否则回调不执行
 2.dispatch_source_set_timer 中第二个参数,当我们使用 dispatch_time 或者 DISPATCH_TIME_NOW 时,系统会使用默认时钟来进行计时。然而当系统休眠的时候,默认时钟是不走的,也就会导致计时器停止。使用 dispatch_walltime 可以让计时器按照真实时间间隔进行计时
 3.dispatch_source_set_timer 的第四个参数 leeway 指的是一个期望的容忍时间,将它设置为 1 秒,意味着系统有可能在定时器时间到达的前 1 秒或者后 1 秒才真正触发定时器。在调用时推荐设置一个合理的 leeway 值。需要注意,就算指定 leeway 值为 0,系统也无法保证完全精确的触发时间,只是会尽可能满足这个需求。
 */
//创建timer
- (dispatch_source_t)creatTimer{
    static int plus = 0;
    static dispatch_source_t _timer = nil;
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), 1 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
    dispatch_source_set_event_handler(_timer, ^{
        NSLog(@"plus = %d",plus++);
    });
    dispatch_resume(_timer);
    return _timer;
}
//销毁timer

- (void)destoryTimer:(dispatch_source_t)timer{
    dispatch_source_cancel(timer);
    timer = nil;
}
/**
    1.使用 dispatch_suspend 时,Timer 本身的实例需要一直保持。
    2.这种方式只是让timer挂起并没有销毁,不可置为nil,否则会崩溃
 */
- (void)destoryUseTimer:(dispatch_source_t)timer{
    dispatch_suspend(timer);
}
上一篇 下一篇

猜你喜欢

热点阅读