NSTimer 不准时,使用GCD定时器代替的方法

使用NSTimer 常常会不准时,因为它被添加到RunLoop,而RunLoop要处理的事情比较多,包括source,timer,observer,所以时间上总是偏差也是正常.

那么如果对时间要求比较严格的话,可以使用GCD定时器代替.因为GCD定时器不受RunLoop影响.


#import "ViewController.h"


@interface ViewController ()

/** 定时器(这里不用带*,因为dispatch_source_t就是个类,内部已经包含了*) */

@property (nonatomic,strong) dispatch_source_t timer;

@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    

}


int count =0;

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    // 获得队列

//    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    dispatch_queue_t queue =dispatch_get_main_queue();

    

    // 创建一个定时器(dispatch_source_t本质还是个OC对象)

    self.timer =dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,0, 0, queue);

    

    //设置定时器的各种属性(几时开始任务,每隔多长时间执行一次)

    // GCD的时间参数,一般是纳秒(1 == 109次方纳秒)

    //何时开始执行第一个任务

    // dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC)比当前时间晚3

    dispatch_time_t start =dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC));

   uint64_t interval = (uint64_t)(1.0 *NSEC_PER_SEC);

   dispatch_source_set_timer(self.timer, start, interval,0);

    

    // 设置回调

    dispatch_source_set_event_handler(self.timer, ^{

        NSLog(@"------------%@", [NSThreadcurrentThread]);

             (你想要处理业务,block方式)

       count++;

        

//        if (count == 4) {

//            // 取消定时器

//            dispatch_cancel(self.timer);

//            self.timer = nil;

//        }

    });

    

//dispatch_source_set_event_handler_f(self.timer, dispatch_function_t handler)(函数调用方式);

    // 启动定时器

    dispatch_resume(self.timer);

}

@end


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值