所谓的Runloop其实就是死循环
总共有5种模式
每条线程都有一个runloop 但是默认够不开启循环
作用
a. 保证Runloop 所在线程不退出
b. 负责监听事件iOS触摸、时钟、网络等
模式
a.UI与默认模式同时出现的时候,UI模式的优先级更高
将 NSTimer 添加到Runloop
a. NSDefaultRunLoopMode 默认模式
b. UITrackingRunLoopModel UI模式
c. NSRunLoopCommonModes 占位模式 (UI&默认)
例子
当页面有滚动视图时
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic, strong)NSThread *thread;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.thread = [[NSThread alloc] initWithBlock:^{
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] run];
}];
[self.thread start];
}
- (void)timerAction
{
NSLog(@"timer action");
}
@end
Source事件源
按照函数调用栈
souce0: 非source1就是
souce1: 系统内核事件
GCD包装成的source
#import "SecondController.h"
@interface SecondController ()
@property(nonatomic, strong)dispatch_source_t timer;
@end
@implementation SecondController
- (void)viewDidLoad {
[super viewDidLoad];
// GCD timer
self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
//设置定时器各种属性
dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, 0);
// 设置回调
dispatch_source_set_event_handler(self.timer, ^{
NSLog(@"-----%@", [NSThread currentThread]);
});
// 启动timer
dispatch_resume(self.timer);
}
@end
Observe 观察者
参照git一个例子