iOS 中的RunLoop

21 篇文章 0 订阅
13 篇文章 0 订阅

写个伪代码,我们的日常:

while(活着)
	有事干了 = 我睡觉去了();
	if (搬砖){
		搬砖()
	}else if (泡妞){
		泡妞()
	}else{
	吃饭()
	}
}

为什么要有RunLoop?
1、使程序一直运行
2、使程序在那些时候处理那些Event
3、调用结偶(滑动的时候不能卡住、消息队列)
4、节省CPU时间请添加图片描述
于RunLoop有关系的几个东西
NSTimer、UIEvent、Autorelease
CADisplayLink、CATransition、CAAnimation
dispatch_get_main_queue()
NSURLConnection、AFNetWorking请添加图片描述
请添加图片描述
请添加图片描述
CFRunLoopSource
Source是数据源RunLoop的抽象类
RunLoop定义了两个Version的Source

• Source0 :非基于Port的 处理事件,什么叫非基于Port的呢?就是说你这个消息不是其他进程或者内核直接发送给你的。一般是APP内部的事件, 比如hitTest:withEvent的处理, performSelectors的事件.Swift ->CFRunLoopSourceContext

Source1 :基于mach_Port的,来自系统内核或者其他进程或线程的事件,可以主动唤醒休眠中的RunLoop(iOS里进程间通信开发过程中我们一般不主动使用)。mach_port大家就理解成进程间相互发送消息的一种机制就好, 比如屏幕点击, 网络数据的传输都会触发sourse1。如 CFMachPort、

CFMessagePort Swift ->CFRunLoopSourceContext1

CFRunLoopMode
NSDefaultRunLoopMode 默认状态、空闲状态
UITrackingRunLoopMode 滑动ScrollView时
UIInitializationRunLoopMode 私有App启动的时候
NSRunLoopCommonModes

extension CFRunLoopMode {
    public static let defaultMode: CFRunLoopMode!
    public static let commonModes: CFRunLoopMode!
}

经典问题?

页面上有Timer ,在滚动ScrollView的时候Timer不会跑!
设置为commonModes

滑动时RunLoopModel的切换(堆栈中有一个pushRunLoopMode和popRunLoopMode的过程)
NSDefaultRunloopMode -> UITrackingRunLoopMode -> NSDefaultRunloopMode

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值