GCD实现计时器

    dispatch_source_t _timer; // 必须创建成全局变量,否则执行一次就会被release掉。

    

    __block int n = 0;

    _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());

    

    /**

     *  dispatch_source_set_timer(dispatch_source_t source,

     *  dispatch_time_t start,

     *  uint64_t interval,

     *  uint64_t leeway);

     *  

     *  params:

     *      start: 定时器开始时间,可以通过dispatch_timedispatch_walltime函数来创建,也可以使用常量DISPATCH_TIME_NOWDISPATCH_TIME_FOREVER

     *      interval: 间隔时间,1.0 * NSEC_PER_SEC 一秒

     *  leeway: 计时器触发的精准程度

     */

    dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, 0);

    

    // 计时器的触发block

    dispatch_source_set_event_handler(_timer, ^{

        ++n;

        NSLog(@"%i", n);

        if (10 == n) {

            dispatch_source_cancel(_timer);

        }

    });

    

    // 计时器cancel的时候触发的block

    dispatch_source_set_cancel_handler(_timer, ^{

        NSLog(@"cancel");

    });

    

    // 因为dispatch_source启动时默认是挂起状态的,需要手动启动。

    dispatch_resume(_timer);


你可能感兴趣的:(iOS)