2016 - 1 - 20 runloop学习(2)
一:CFRunLoopModeRef
1. CFRunLoopModeRef带表RunLoop的运行模式
2. 一个Runloop可以有若干个mode,每个mode又包含若干个sourse,timer,observer


3. 每当RunLoop启动时,只能指定其中一个mode,这个Mode被称为CurrentMode
[[NSRunLoop currentRunLoop].currentMode
如果需要切换Mode,只能退出Runloop,再重新指定一个Mode来运行。这样做的目的就是为了分割不同组的Source/Timer/Observer.
4.两个常用的Mode
4.1 kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode中运行的。
4.2 UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时,不受其他Mode影响。
二:添加定时器到不同Mode中的区别
1.当程序中有scrollView等滚动时,RunLoop的模式切换为UITrackingRunLoopMode,如果将定时器添加到NSDefaultRunloopMode中,滚动比如textView定时器将不工作。如以下代码:
- (void)viewDidLoad {
[super viewDidLoad];
NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES ];
// 将定时器添加到当前主线程的RunLoop的默认Mode下
// 可以发现,当textView滚动时,不会打印
[[NSRunLoop currentRunLoop ] addTimer:timer forMode:NSDefaultRunLoopMode];
}
- (void)run{
NSLog(@"%s",__func__);
}
2.如果将定时器加入的Mode设为NSRunLoopCommonModes时,则当RunLoop为NSDefaultRunloopMode与UITrackingRunLoopMode时都将工作。
[super viewDidLoad];
NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES ];
// 将定时器添加到当前主线程的RunLoop的默认Mode下
// 如果改为forMode:NSRunLoopCommonModes,则定时器继续工作
[[NSRunLoop currentRunLoop ] addTimer:timer forMode:NSRunLoopCommonModes];
}
- (void)run{
NSLog(@"%s",__func__);
}
3.可以在打印RunLoop对象中发现:

可以发现,NSRunLoopCommonModes其实相当于一个标记符,标记某些Mode,默认标记是DefaulMode与TrackingMode。
2016 - 1 - 20 runloop学习(2)的更多相关文章
- 2016 - 1 - 20 runloop学习
一:Runloop基本知识 1.本质就是运行循环 2.基本作用: 2.1保证程序持续运行 2.2处理APP中的各种事件:触摸,定时器,selector... 2.3节省CPU资源,系统程序性能:它会让 ...
- Stack Overflow 2016年度 20个最佳Python问题(一)
Stack Overflow 2016年度 20个最佳Python问题(一) https://zhuanlan.zhihu.com/p/25020763
- 2016 - 2 - 20 ARC知识总结(二 autorelease概念及实现)
首先祝自己生日快乐~23咯~ 一 autorelease的概念 autorelease会像C语言的自动变量那样来对待对象实例.当超出作用域(相当于变量作用域)时,对象的实例release实力方法被调 ...
- RunLoop学习总结
开始 很久之前就看了一次YY的文章,没看懂.后来又看了sunny的视频和叶孤城的直播的视频,找了很多资料,对RunLoop也越来越清晰,然后又看了两三次YY的文章,虽然还没完全看懂,不得不说写的非常好 ...
- 北京工业大学耿丹学院2016下C作业学习总结
北京工业大学耿丹学院2016下C的班级地址在https://edu.cnblogs.com/campus/bjgygd/Sixteen-One . 第一次作业:两部分 第一部分:新建博客,书写第一篇随 ...
- Hitcon 2016 Pwn赛题学习
PS:这是我很久以前写的,大概是去年刚结束Hitcon2016时写的.写完之后就丢在硬盘里没管了,最近翻出来才想起来写过这个,索性发出来 0x0 前言 Hitcon个人感觉是高质量的比赛,相比国内的C ...
- [New Learn] RunLoop学习-官方译文
Run Loops Run loops是线程的一个基本构成部分.一个run loop 是一个事件处理循环,你可以使用它来处理线程收到的事件.设计run loop的目的就是可以使得线程在收到事件的时候处 ...
- 我的runloop学习笔记
前言:公司项目终于忙的差不多了,最近比较闲,想起叶大说过的iOS面试三把刀,GCD.runtime.runloop,runtime之前已经总结过了,GCD在另一篇博客里也做了一些小总结,今天准备把ru ...
- 从零开始HTML(二 2016/9/20)
1.布局 ① 使用 <div> 元素的 HTML 布局,<div> 元素常用作布局工具,因为能够轻松地通过 CSS 对其进行定位. <!DOCTYPE html> ...
随机推荐
- NOI LINUX装机记
装了差不多一天啊!! 首先自己用虚拟光驱来运行,然后莫名其妙就炸了. 搞到最后刻了一个盘. 然后装完linux之后发现回不到windows7了. 网上找各种资料. 最后搞了个root,再启动的文件中加 ...
- Android Snackbar
使用Snackbar我们可以在屏幕底部(大多时候)快速弹出消息,它和Toast非常相似,但是它更灵活一些. 当它显示一段时间后或用户与屏幕交互时它会自动消失. 可以自定义action-可选操作. sw ...
- java synchronized静态同步方法与非静态同步方法,同步语句块
摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方 ...
- Windows安装Python图像处理库:PIL模块
平常一般都在Linux下用Python,今天女票突然说让帮忙把一些图片全部弄成一个分辨率的,作为程序员,这种重复的工作还是交给计算机吧. 废话不多说,打开Cmd看下Windows的python下面是否 ...
- Thread类的使用
在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知识:线程的几种状态.上下文切换,然后接着 ...
- Ajax请求中带有IPv6地址后的百分号的问题
IPv6地址后的百分号: 对于连入网络但没有IPv6路由器或DHCPv6服务器的IPv6客户端,它们始终使用fe80::/64链路本地网络地址.如果运行Windows的计算机中有多个网络适配器连接到不 ...
- java.lang.IllegalArgumentException: addChild: Child name '/SSHE' is not unique
错误信息: Caused by: java.lang.IllegalArgumentException: addChild: Child name '/SSHE' is not unique ...
- poj1190 生日蛋糕(深搜+剪枝)
题目链接:poj1190 生日蛋糕 解题思路: 深搜,枚举:每一层可能的高度和半径 确定搜索范围:底层蛋糕的最大可能半径和最大可能高度 搜索顺序:从底层往上搭蛋糕,在同一层尝试时,半径和高度都是从大到 ...
- Java多线程-新特征-锁(上)
在Java5中,专门提供了锁对象,利用锁可以方便的实现资源的封锁,用来控制对竞争资源并发访问的控制,这些内容主要集中在java.util.concurrent.locks 包下面,里面有三个重要的接口 ...
- Linux下配置用msmtp和mutt发邮件
Linux下可以直接用mail命令发送邮件,但是发件人是user@servername,如果机器没有外网的dns,其他人就无法回复.此时,有一个可以使用网络免费邮箱服务的邮件发送程序就比较重要了.ms ...