runloop和线程有什么关系?

匿名网友 匿名网友 发布于: 2016-09-01 00:00:00
阅读 133 收藏 0 点赞 0 评论 0

  • 每条线程都有唯一的一个RunLoop对象与之对应的
  • 主线程的RunLoop是自动创建并启动
  • 子线程的RunLoop需要手动创建
  • 子线程的RunLoop创建步骤如下:
  • 在子线程中调用NSRunLoop currentRunLoop创建RunLoop对象(懒加载,只创建一次)
  • 获得RunLoop对象后要调用run方法来启动一个运行循环   ####runloop的mode作用是什么?
  • 用来控制一些特殊操作只能在指定模式下运行,一般可以通过指定操作的运行mode来控制执行时机,以提高用户体验
  • 系统默认注册了5个Mode
  • kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行,对应OC中的:NSDefaultRunLoopMode
  • UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他Mode影响
  • kCFRunLoopCommonModes:这是一个标记Mode,不是一种真正的Mode,事件可以运行在所有标有common modes标记的模式中,对应OC中的NSRunLoopCommonModes,带有common modes标记的模式有:UITrackingRunLoopMode和kCFRunLoopDefaultMode
  • UIInitializationRunLoopMode:在启动 App时进入的第一个 Mode,启动完成后就不再使用
  • GSEventReceiveRunLoopMode:接受系统事件的内部Mode,通常用不到 #### 以+scheduledTimerWithTimeInterval…的方式触发的timer,在滑动页面上的列表时,timer会暂定回调,为什么?如何解决?
  • 这里强调一点:在主线程中以+scheduledTimerWithTimeInterval…的方式触发的timer默认是运行在NSDefaultRunLoopMode模式下的,当滑动页面上的列表时,进入了UITrackingRunLoopMode模式,这时候timer就会停止
  • 可以修改timer的运行模式为NSRunLoopCommonModes,这样定时器就可以一直运行了
  • 以下是我的笔记补充:
  • 在子线程中通过scheduledTimerWithTimeInterval:…方法来构建NSTimer
  • 方法内部已经创建NSTimer对象,并加入到RunLoop中,运行模式为NSDefaultRunLoopMode
  • 由于Mode有timer对象,所以RunLoop就开始监听定时器事件了,从而开始进入运行循环
  • 这个方法仅仅是创建RunLoop对象,并不会主动启动RunLoop,需要再调用run方法来启动
  • 如果在主线程中通过scheduledTimerWithTimeInterval:…方法来构建NSTimer,就不需要主动启动RunLoop对象,因为主线程的RunLoop对象在程序运行起来就已经被启动了 #### 猜想runloop内部是如何实现的?
  • 从字面意思看:运行循环、跑圈;
  • 本质:内部就是do-while循环,在这个循环内部不断地处理各种事件(任务),比如:Source、Timer、Observer;
  • 每条线程都有唯一一个RunLoop对象与之对应,主线程的RunLoop默认已经启动,子线程的RunLoop需要手动启动;
  • 每次RunLoop启动时,只能指定其中一个 Mode,这个Mode被称作 CurrentMode,如果需要切换Mode,只能退出Loop,再重新指定一个Mode进入,这样做主要是为了隔离不同Mode中的Source、Timer、Observer,让其互不影响;

评论列表
文章目录