timer、CADisplayLink、dispatch_sou

2021-01-18  本文已影响0人  code_牧轩

1.CADisplayLink

  保证调用频率和屏幕的刷帧频率一致,1秒调用60次;

2.timer

 NSTimer依赖Runloop,如果runloop的任务过于繁重的话,就不准时了。

  runloop每跑一圈话费的时间是不固定;

    GCD的定时器是不依赖runloop的比较准时;

//  会发生循环引用;

    self.link = [CADisplayLink displayLinkWithTarget:self selector:@selector(linkTest)];

    [self.link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:[LZHProxy proxyWith:self] selector:@selector(linkTest) userInfo:nil repeats:YES];

// 解决循环引用方法一:

    __weaktypeof(self) weakSelf =self;

    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {

        [weakSelflinkTest];

    }];

//消息转发机制;

//    NSProxy 

// GCD的定时器

    NSLog(@"begin");

//  创建定时器  :如果队列是非主队列,会自动放入子线程执行任务定时器‘

    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,dispatch_get_main_queue());

//  设置定时器的时间;

    uint64_tstart =2.0;//2秒后开始执行

    uint64_tinterval =1.0;//每隔1秒执行

    dispatch_source_set_timer(timer,dispatch_time(DISPATCH_TIME_NOW, start*NSEC_PER_SEC), interval * NSEC_PER_SEC, 0);

//  设置回调函数

    dispatch_source_set_event_handler(timer, ^{

        NSLog(@"-----");

    });

    dispatch_source_set_event_handler_f(timer,timerFire);

//  启动定时器

    dispatch_resume(timer);

上一篇下一篇

猜你喜欢

热点阅读