概述
1、Runloops和线程:
Runloops是线程的底层基础,它的本质是线程中运行着的循环!
2、一个Runloop:
是一个事件处理的循环,用来不停的调度工作以及处理输入事件。
3、使用run loop的目的:
是让线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。
4、Run loop的管理并不完全自动的。
5、Cocoa 和 CoreFoundation 框架中各有完整的一套关于 runloop 对象的操作api.
Runloop中必须知道的概念
1、RunloopModes Runloop运行的模式
2、RunLoop 的事件源
|---异步的inputSources
|---|---Port-Based Sources 基于端口的输入源
|---|--- Custom Input sources. 自定义输入源
|---同步的timerSources
3、RunLoop Observers, RunLoop 运行过程中的状态观察者
Runloop配置使用
Cocoa框架
// 获取当前runloop
NSRunLoop* myRunLoop = [NSRunLoop currentRunLoop];
NSDate* futureDate = [NSDate dateWithTimeIntervalSinceNow:1.0];
// 创建时间源
NSTimer* myTimer = [[NSTimer alloc] initWithFireDate:futureDate interval:0.1 target:self selector:@selector(myDoFireTimer1:) userInfo:nil repeats:YES];
// 将时间源添加到runloop中,并设置runloopMode
[myRunLoop addTimer:myTimer forMode:NSDefaultRunLoopMode];
// 该方法会自动将生成的timer事件源添加到当前线程的runloop中,runloopMode是默认的NSDefaultRunLoopMode
[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(myDoFireTimer2:) userInfo:nil repeats:YES];
CoreFoundation 框架
// 获取当前runloop
CFRunLoopRef runLoop = CFRunLoopGetCurrent();
// 获取上下文结构
CFRunLoopTimerContext context = {0, NULL, NULL, NULL, NULL};
// 创建定时器
CFRunLoopTimerRef timer = CFRunLoopTimerCreate(kCFAllocatorDefault, 0.1, 0.3, 0, 0, &myCFTimerCallback, &context);
// 将定时器添加进runloop中
CFRunLoopAddTimer(runLoop, timer, kCFRunLoopCommonModes);
翻看了几份文档翻译,发现还是这个最好!
首选推荐:http://www.jianshu.com/p/8e40a7b16357
这位大神同一个系列的学习笔记推荐,👍!
这份翻译是完全根据开发文档翻译过来的,可以参考这个,同时对照开发文档自己翻译一份!
http://www.cocoachina.com/ios/20170407/18998.html
网友评论