美文网首页
RunLoop?看我就够了

RunLoop?看我就够了

作者: CoderXLL | 来源:发表于2018-01-26 15:40 被阅读0次

一、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];

未完待续...

相关文章

网友评论

      本文标题:RunLoop?看我就够了

      本文链接:https://www.haomeiwen.com/subject/tuhdoxtx.html