关于runloop的一些随想

  在工作中可能很多ios的开发者觉得一些底层的东西很难,觉得根本理解不了,我在面试的过程中一旦问到求职者一些稍底层的东西,多半都答不上来,就拿runloop来说 吧,其实它并不难,相反如果你能够掌握这些会给你的工作带来很大便利,下面就说一说runloop的那些事!

  runloop,顾名思义就是一个循环,在Core Foundation中与runloop相关的一共有5个大类,CFRunLoopRef(runloop本身) 、CFRunLoopModeRef(runloop的运行模式)、CFRunLoopSourceRef(runloop的事件源,输入源等)、CFRunLoopTimerRef(时间)、CFRunLoopObseverRef(对runloop进行观察);在一个runloop中可以有两个或者多个运行模式(Mode),而在Mode里面会有source、observe、timer,runloop在启动的时候只能指定一个运行模式(Mode),这个Mode就是CurrentMode,而在这个Mode里至少要有一个source或者timer。就好比空调要有多种模式(制冷,制热,吹风等),而空调在运行的时候只能选择一种模式,并且这个模式至少要有一个温度设置,道理基本类似。如果需要切换Mode,只能退出runloop然后重新指定一个mode进入,这样做可以分隔开不同组的Source/timer/observe,让其互不影响。

  下面就来看看CFRunLoopModeRef运行模式,runloop的运行模式一共有5种;

  ♦KCFRunLoopDefaultMode: App默认的Mode,通常主线程都是在这个Mode下运行(重要)

  UITrackingRunLoopMode:界面追踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其它Mode影响(重要)

  UIInitializationRunLoopMode:在刚启动App时进入的第一个Mode,启动完成后就不再使用(只做了解即可)

  GSEventReceiveRunLoopMode:接受系统事件的内部Mode,一般用不到(只做了解即可)

  KCFRunLoopCommonModes:占位用的Mode,不是一种真正的Mode(重要)

 

  看了上面所说可能对runloop有了一些初步的了解,下面用代码来说一些runloop的简单用法;

  1、[NSRunLoop currentRunLoop].currentMode;   查看当前runloop的运行模式

  2、[[NSRunLoop currentRunLoop] addTimer:time forMode:NSDefaultRunLoopMode];  给当前runloop添加定时器并设定运行模式(NSDefaultRunLoopMode默认模式、UITrackingRunLoopMode界面追踪模式)

  3、关于第2条的补充示例,就拿scrollview来说,比如我们控制器上面有一个scrollview,当我们添加了DefaultRunLoopMode时runloop就进入默认模式,但是当我们滑动scrollview时默认运行模式就不会执行了,然后scrollview停止滑动后run默认模式重新执行,(主要原因为scrollview滑动只能使用runloop的界面追踪模式),反之如果我们添加runloop为UITrackingRunLoopMode结果就会反过来;如果有一个需求需要scrollview停止滑动时启动默认运行模式,scrollview滑动时启动界面追踪模式,我们可以有两个方法去解决:

第一种:我们可以把定时器添加两次

[[NSRunLoop currentRunLoop] addTimer:time forMode:NSDefaultRunLoopMode];

[[NSRunLoop currentRunLoop] addTimer:time forMode:UITrackingRunLoopMode];   即可 这是一种比较笨的方法

第二种:我们需要借用KCFRunLoopCommonModes占位Mode来解决这个问题,代码如下

//NSRunLoopCommonModes = NSDefaultRunLoopMode + UITrackingRunLoopMode

[[NSRunLoop currentRunLoop] addTimer:time forMode:NSRunLoopCommonModes];  在这里需要说明一下,CommonModes并非真正的Mode,相当于一个标签,凡是添加到此Mode中的事件都会被同时添加到打上此标签的运行模式上

4、关于runloop在线程中的一点说明,在主线程中runloop是自动创建的,无需重新创建,但是在分线程中如果需要使用runloop需要我们手动创建,创建方法如下

NSRunLoop *currentRunloop = [NSRunLoop currentRunLoop];
    //开启runloop(runloop创建完毕需要开启,有三个run方法,各有特点,很浅显就能明白,有兴趣可以看一下)
    [currentRunloop run];

 

关于runloop就在暂时先写这些,有时间的话就在谢谢runloop一些别的用法。

 

转载于:https://www.cnblogs.com/li-cocoa/p/5779324.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值