一、RunLoop的定义
RunLoop,直白的翻译就是运行循环,而且是一个灵活的死循环。为什么说灵活呢?因为它可以在我们需要的时候自己跑起来,在我们没有操作的时候停下来。节省CPU资源,提高程序性能。
二、RunLoop的功能
1. 保证线程长久存活
实际上当你的程序一启动,就会默认开启一个主线程,主线程一开起来就会跑一个主线程对应的RunLoop,RunLoop保证了主线程不会被销毁,同时保证了程序的持续正常运行。
如下,给自己开启的线程添加RunLoop,保证自定义线程持续运行
// 1.创建并开启一个线程
XLLThread *thread = [[XLLThread alloc] initWithTarget:self selector:@selector(threadOperation) object:nil];
thread.name = @"XLLThread";
[thread start];
self.thread = thread;
// 2.子线程启动时,启动RunLoop
- (void)threadOperation
{
@autoreleasepool {
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
// 如果注释了下面这一行,子线程中的任务并不能正常执行
[runLoop addPort:[NSMachPort port] forMode:NSRunLoopCommonModes];
// 启动RunLoop
[runLoop run];
}
}
// 3.调用 [NSObject performSelector:onThread:..] 将这个任务扔到后台线程的 RunLoop 中
[self performSelector:@selector(subThreadOperation) onThread:self.subThread withObject:nil waitUntilDone:NO];
// 4.happy地执行任务
- (void)subThreadOperation
{
...
}
2.处理App中的各种事件,比如触摸事件,定时器事件,Selector事件等
下面是NSTimer的两种写法
// 1.第一种写法
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
[timer fire];
// 2.第二种写法
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
未完待续...
网友评论