傲视苍穹iOS《Objective-C》VIP专题线程

iOS 计时器 dispatch_source

2017-04-05  本文已影响2347人  rockyMJ

优点:

*时间准确

*可以使用子线程,解决定时间跑在主线程上卡UI问题
一:需要将dispatch_source_t 设置为成员变量,不然会立即释放

@implementation ViewController
{
    
    dispatch_source_t _timer;
    
}

二:创建计时器

- (void)initTimer {
    dispatch_queue_t queue = dispatch_get_main_queue();
    
    // 创建一个定时器(dispatch_source_t本质还是个OC对象)
    _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    
    // 设置定时器的各种属性(几时开始任务,每隔多长时间执行一次)
    /**
     何时开始执行第一个任务 (开始计时时间)
     dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC) 比当前时间晚3秒
     */
    dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC));
    uint64_t interval = (uint64_t)(3.0 * NSEC_PER_SEC);
    dispatch_source_set_timer(_timer, start, interval, 0);
    // 设置回调
    dispatch_source_set_event_handler(_timer, ^{
#warning 是否需要重复计时(默认是重复计时的)
//        dispatch_source_cancel(_timer);
        dispatch_async(dispatch_get_main_queue(), ^{
            [self timerEnd];
            
        });
    });
    // 启动定时器 -(可以根据自己的需求,调用此方法)
    dispatch_resume(_timer);
}

三:计时结束


- (void)timerEnd {
    NSLog(@"计时结束-可以开始自己的任务啦");
}
上一篇 下一篇

猜你喜欢

热点阅读