iOS开发中 NSRunloop 与NSTimer的问题
来源:互联网 发布:fifaonline3m数据错误 编辑:程序博客网 时间:2024/05/05 15:46
NSRunLoop工作原理
通过所有的“消息”都被添加到了NSRunLoop中去,而在这里这些消息并分为“input source”和“Timer source” 并在循环中检查是不是有事件需要发生,如果需要那么就调用相应的函数处理。
我们在使用NSTimer的时候,可能会接触到runloop的概念,下面是一个简单的例子:
1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 // Do any additional setup after loading the view, typically from a nib. 5 NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 6 target:self 7 selector:@selector(printMessage:) 8 userInfo:nil 9 repeats:YES];10 }
这个时候如果我们在界面上滚动一个scrollview,那么我们会发现在停止滚动前,控制台不会有任何输出,就好像scrollView在滚动的时候将timer暂停了一样,在查看相应文档后发现,这其实就是runloop的mode在做怪。
NSRunLoopCommonModes默认会包含NSDefaultRunLoopMode和UITrackingRunLoopMode,这个时候如果我们在界面上滚动一个scrollview,那么我们会发现在停止滚动前,控制台不会有任何输出,就好像scrollView在滚动的时候将timer暂停了一样,在查看相应文档后发现,这其实就是runloop的mode在做怪。
runloop可以理解为cocoa下的一种消息循环机制,用来处理各种消息事件,我们在开发的时候并不需要手动去创建一个runloop,因为框架为我们创建了一个默认的runloop,通过[NSRunloop currentRunloop]我们可以得到一个当前线程下面对应的runloop对象,不过我们需要注意的是不同的runloop之间消息的通知方式。
接着上面的话题,在开启一个NSTimer实质上是在当前的runloop中注册了一个新的事件源,而当scrollView滚动的时候,当前的MainRunLoop是处于UITrackingRunLoopMode的模式下,在这个模式下,是不会处理NSDefaultRunLoopMode的消息(因为RunLoop Mode不一样),要想在scrollView滚动的同时也接受其它runloop的消息,我们需要改变两者之间的runloopmode.
1 [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
简单的说就是NSTimer不会开启新的进程,只是在Runloop里注册了一下,Runloop每次loop时都会检测这个timer,看是否可以触发。当Runloop在A mode,而timer注册在B mode时就无法去检测这个timer,所以需要把NSTimer也注册到A mode,这样就可以被检测到。
- iOS开发中 NSRunloop 与NSTimer的问题
- IOS开发中NSRunloop跟NSTimer的问题
- IOS开发中NSRunloop跟NSTimer的问题
- IOS开发中NSRunloop跟NSTimer的问题
- iOS开发中NSRunloop跟NSTimer的问题
- IOS开发中NSRunloop跟NSTimer的问题
- IOS开发中NSRunloop跟NSTimer的问题
- IOS开发中NSRunloop跟NSTimer的问题
- IOS开发中NSRunloop跟NSTimer的问题
- IOS开发中NSRunloop跟NSTimer的问题
- NSRunloop与NSTimer在IOS开发中如何工作
- IOS开发——NSRunloop与NSTimer
- iOS NSRunLoop跟NSTimer的问题
- NSTimer与NSRunLoop的关系分析
- 一些关于NSRunLoop与NSTimer的知识
- NSTimer与NSRunLoop的关系分析
- NSTimer 与 NSRunLoop Modes
- NSTimer与NSRunLoop
- [BZOJ 1143][CTSC2008]祭祀river
- 在64位ubuntu上安装tensorflow 以及源码安装
- 如何删除一张表的重复记录
- android的照相图片压缩
- Codeforces 651E Table Compression【并查集】
- iOS开发中 NSRunloop 与NSTimer的问题
- Kalman滤波器
- QML中计时器的使用,实现一个简单的倒计时程序
- SSL 2496 线性递推式 矩阵乘法
- Eclipse注释快捷键
- mysql数据库千万级别数据的查询优化和分页测试
- UVa 1363 约瑟夫的数论问题
- js获取cookie值
- cocos2d-x使用地图编辑器的类(cocos2d-x学习)