黑马程序员技术交流社区

标题: 帮你秒杀这样的面试官:“关于RunLoop你给我唠一个点吧” [打印本页]

作者: Simpon    时间: 2016-8-26 17:41
标题: 帮你秒杀这样的面试官:“关于RunLoop你给我唠一个点吧”
本帖最后由 Simpon 于 2016-10-19 11:35 编辑

运行循环官方示意图
file:///Users/LilMing/Desktop/8%E6%9C%88%E6%8A%80%E6%9C%AF%E6%96%87%E7%AB%A0/%E5%B9%BF%E5%B7%9E%E6%A0%A1%E5%8C%BA/images/001-%E8%BF%90%E8%A1%8C%E5%BE%AA%E7%8E%AF%E7%A4%BA%E6%84%8F%E5%9B%BE.png
基本概念运行循环(消息循环)的目的
运行循环保证程序不退出RunLoop对象
RunLoop 与线程关系获取 RunLoop 对象
运行结果:
01.运行循环概念[1818:115628] currentRunLoop = 0x7fd8d2e04810
01.运行循环概念[1818:115628] mainRunLoop = 0x7fd8d2e04810
01.运行循环概念[1818:115684] 子线程 currentRunLoop = 0x7fd8d2e65300
运行结果:
01.运行循环概念[1833:116567] currentRunLoop = 0x7f8f30e054f0
01.运行循环概念[1833:116567] mainRunLoop = 0x7f8f30e054f0
01.运行循环概念[1833:116643] 子线程 currentRunLoop = 0x7f8f30f09950
运行循环模式
运行循环 的输入事件
file:///Users/LilMing/Desktop/8%E6%9C%88%E6%8A%80%E6%9C%AF%E6%96%87%E7%AB%A0/%E5%B9%BF%E5%B7%9E%E6%A0%A1%E5%8C%BA/images/001-%E8%BF%90%E8%A1%8C%E5%BE%AA%E7%8E%AF%E7%A4%BA%E6%84%8F%E5%9B%BE.png * Runloop 接收输入事件来自两种不同的来源:输入源(input source)和 定时源(timer source) * 输入源 事件包括用户在屏幕上的 触摸 事件,NSPort 对象和 performSelector:onThread: * 定时源 指的是定时器 NSTimer
NSTimer
NSTimer 练习
[Objective-C] 纯文本查看 复制代码
(void)viewDidLoad {
    [super viewDidLoad];
    // 创建定时器
    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(display) userInfo:nil repeats:YES];
    // 将定时器添加到 RunLoop 的 NSDefaultRunLoopMode 模式里面 主线程RunLoop默认的模式
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
}
   
    /// NSTimer过1.0秒调用一次
(void)display {
    NSLog(@"定时器方法被调用了: runloop = %@", [[NSRunLoop currentRunLoop] currentMode]);
}

[AppleScript] 纯文本查看 复制代码
(void)viewDidLoad {
    [super viewDidLoad];
// 创建定时器
    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(display) userInfo:nil repeats:YES];
// 将定时器添加到 RunLoop 的 NSDefaultRunLoopMode 模式里面 主线程RunLoop默认的模式 //
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
// 将定时器添加到 RunLoop 的 NSRunLoopCommonModes 模式里面,当UIScrollView滚动时,进入 UITrackingRunLoopMode 模式
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}

[Objective-C] 纯文本查看 复制代码
(void)viewDidLoad {
    [super viewDidLoad];
// 创建定时器
    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(display) userInfo:nil repeats:YES];
// 将定时器添加到 RunLoop 的 NSDefaultRunLoopMode 模式里面 主线程RunLoop默认的模式
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
// 将定时器添加到 RunLoop 的 NSRunLoopCommonModes 模式里面,当UIScrollView滚动时,进入 UITrackingRunLoopMode 模式
//    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
// 当UIScrollView滚动时,进入 UITrackingRunLoopMode 模式, 将 timer 加入到 UITrackingRunLoopMode,只在 UITrackingRunLoopMode下才会执行timer, 在 NSDefaultRunLoopMode 模式里面不会执行
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
}

子线程的消息循环
精华推荐:
黑马程序员:为苹果与iOS开发者的前景正名
与君共勉 --- 记黑马22期同学成长经验。
【持续更新】2016年最全最新的iOS视频+软件+源码+面试/技术
关于iOS 10最新的课程视频及demo第三弹,火速发布了









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2