1.runloop基本概念:
一个RunLoop是一个事件处理环,系统利用这个事件处理环来安排事务,协调输入的各种事件。RunLoop的目的是让你的线程在有工作的时候忙碌,没有工作的时候休眠(和线程相关)。
2.作用:
使程序一直运行接受用户输入
决定程序在何时应该处理哪些Event
调用解耦(主调方产生很多事件,不用等到被调方处理完事件之后,才能执行其他操作)
节省CPU时间(当程序启动后,什么都没有执行的话,就不用让CPU来消耗资源来执行,直接进入睡眠状态)
3.构成元素
每一个RunLoop都包含若干个CFRunLoopMode
在同一时间,只能在一种Mode下面执行
当需要切换Mode的时候,就必须退出当前的RunLoop。重新启动一个
系统默认的有以下5种模式
CFRunLoopDefaultMode: 这个是默认 Mode,也是空闲状态。主线程通常在这个 Mode 下运行的。
UITrackingRunLoopMode: ScrollView滚动时候的模式。在此模式下会限制输入事件的处理。
UIInitializationRunLoopMode: 在刚启动程序时进入的第一个 Mode,启动完成后就不再使用。
GSEventReceiveRunLoopMode: 接受系统事件的内部的Mode,这个Mode由GraphicsServices调用在CFRunLoopRunSpecific前面。通常用不到。
CFRunLoopCommonModes: 这是一个数组,包括了第1和第2种模式。
4.CFRunLoopMode的应用举例
当我们在做图片轮播器的时候,如果使用的是kCFRunLoopDefaultMode那么当ScrollView滚动的时候,RunLoop模式就会切换为UITrackingRunLoopMode,这时候NSTimer就没法执行,这时候我们可以使用kCFRunLoopCommonModes,就可以解决这个问题。
二:NSTimer
1.NSTimer是什么?
是一个定时器,能够在每个确定时间间隔里发送信息给对象。
2.使用NSTimer时与RunLoop的三种情况。
1.timer =[NSTimerscheduledTimerWithTimeInterval:1target:selfselector:@selector(repeat:) userInfo:@{@"key":@"value"} repeats:true];
2.dispatch_async(dispatch_get_global_queue(0,0), ^{ timer = [NSTimer scheduledTimerWithTimeInterval:1target:selfselector:@selector(repeat:)userInfo:@{@"key":@"value"} repeats:true];[[NSRunLoop currentRunLoop] run];});
3.timer = [NSTimertimerWithTimeInterval:1target:selfselector:@selector(repeat:) userInfo:@{@"key":@"value"} repeats:true];
[[NSRunLoopcurrentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];