美文网首页
iOS知识点-7.以scheduledTimerWithTime

iOS知识点-7.以scheduledTimerWithTime

作者: 萌小奇 | 来源:发表于2018-12-07 09:33 被阅读9次
    Objective-C Basics
    1. 以scheduledTimerWithTimeInterval的方式触发的timer,在滑动页面上的列表时,timer会暂停,为什么?该如何解决?

    原因在于滑动时当前线程的runloop切换了mode用于列表滑动,导致timer暂停。

    runloop中的mode主要用来指定事件在runloop中的优先级,有以下几种:

    • Default(NSDefaultRunLoopMode):默认,一般情况下使用;
    • Connection(NSConnectionReplyMode):一般系统用来处理NSConnection相关事件,开发者一般用不到;
    • Modal(NSModalPanelRunLoopMode):处理modal panels事件;
    • Event Tracking(NSEventTrackingRunloopMode):用于处理拖拽和用户交互的模式。
    • Common(NSRunLoopCommonModes):模式合集。默认包括Default,Modal,Event Tracking三大模式,可以处理几乎所有事件。

    回到题中的情境。滑动列表时,runloop的mode由原来的Default模式切换到了Event Tracking模式,timer原来好好地运行在Default模式中,被关闭后自然就停止工作了。

    解决方法其一是讲timer加入到NSRunLoopCommonModes中。其二是将timer放到另一个线程中,然后开启另一个线程的runloop,这样可以保证与主线程互不干扰,而现在主线程正在处理页面滑动。示例代码如下:

    * // 方法1
    * [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    * 
    * // 方法2
    * dispatch_async(dispatch_get_global_queue(0, 0), ^{
    *     timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(repeat:) userInfo:nil repeats:true];
    *     [[NSRunLoop currentRunLoop] run];
    * });
    
    上一题 目录 下一题

    相关文章

      网友评论

          本文标题:iOS知识点-7.以scheduledTimerWithTime

          本文链接:https://www.haomeiwen.com/subject/hboccqtx.html