定时器不准 Runloop解决

定时不准原因


  • NSDefaultRunLoopMode 模式中 优先处理输入源事件,处理输入源事件时,不能处理定时源事件
  • 当主线程阻塞时,定时器也会阻塞
  • 如果UITableView滑动时,runloop的mode切换为UITrackingRunLoopMode,计时中断

    //这里的本质是 NSDefaultRunLoopMode 不能使用这种事件循环的模式
//    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //1.手动开启定时器
        NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
        //2.手动加入到事件循环中
        [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
        //3.手动开启定时器
        [timer fire];
        //NSRunLoop 事件循环 处理的事件有:1.输入源事件(滑动事件、触摸事件)2.定时源事件
        //NSDefaultRunLoopMode 模式中 优先处理输入源事件,处理输入源事件时,不能处理定时源事件
        [[NSRunLoop currentRunLoop] run];
    });
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容