RunLoop

作者: CharlyZheng | 来源:发表于2017-05-19 11:23 被阅读6次

1. NSTimer 被UIScrollView暂停

当界面同时存在有定时器和UIScrollView时,比如:一个界面顶部是一个由定时器控制的无限轮播图,下面是一个UIScrollView,这时你如果拖动下面UIScrollView,定时器就会暂停,等UIScrollView的拖动事件结束后定时器才会接着执行。

当你创建输入源(Timer)的时候,需要将其分配给 runloop 中的一个或多个模式。改Timer只会在改特定模式下被触发。

****下面的方法 timer 被添加到 NSDefaultRunLoopMode****

    timer = [NSTimer scheduledTimerWithTimeInterval:10.0
                                             target:self
                                           selector:@selector(getNotificationNews)
                                           userInfo:nil
                                            repeats:YES];

****下面的方法 timer 被添加到 NSRunLoopCommonModes****

    timer = [NSTimer timerWithTimeInterval:10.0
                                    target:self
                                  selector:@selector(getNotificationNews)
                                  userInfo:nil
                                   repeats:YES];
    
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
  • NSDefaultRunLoopMode:将NSTimer添加到主线程NSRunLoop的默认模式下,只有主线程是默认模式下才能执行NSTimer(滚动scrollView,RunLoop默认进入Tracking模式,所以NSTimer不会有效果)。
  • UITrackingRunLoopMode:将NSTimer添加到主线程NSRunLoop的追踪模式下,只有主线程是追踪模式下才能执行NSTimer。(例如滚动scrollView的时候就会监听到计时器)
  • NSRunLoopCommonModes:Common是一个表示,它是将NSDefaultRunLoopMode 和 UITrackingRunLoopMode标记为了Common
    所以,只要将 timer 添加到 Common 占位模式下,timer就可以在Default和UITrackingRunLoopMode模式下都能运行

深入理解RunLoop

相关文章

网友评论

      本文标题:RunLoop

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