Runloop

2016-10-25  本文已影响89人  花前月下

RunLoop

RunLoop定义

当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程.RunLoop就是控制线程生命周期并接收事件进行处理的机制。RunLoop是iOS事件响应与任务处理最核心的机制,它贯穿了iOS整个系统。 运用到RunLoop的框架是 Foundation 和 CoreFoundation C语言框架

RunLoop内部实现原理

RunLoop特性

RunLoop与线程的关系

RunLoop五种模式

NSTimer *timer =  [NSTimer timerWithTimeInterval:1 target:self selector:@selector(run) userInfo:nil repeats:YES];

[[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
// [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
// [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

RunLoop处理的模式的三大块内容: Source 、 Observer、Timer

整体处理逻辑

1.通知Observer,即将进入RunLoop (Observer) --> 2.通知Observer将要处理Timer (Observer) --> 3.通知Observer,将要处理Source() (Observer) --> 4.处理Source0 --> 5.如果有Source1,跳到第九9步 --> 6.通知Observer,线程即将进入睡眠状态 --> 7.休眠,等待唤醒 --> 8.通知Observer,线程刚被唤醒 --> 9.处理唤醒时收到的消息,之后跳回2. --> 10.通知Observer,RunLoop即将退出

RunLoop应用实践

NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
while (!self.isCancelled && !self.isFinished) {
    @autoreleasepool {
            [runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];
    }
}
@autoreleasepool {
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
        [runLoop run];
}
// 在30分钟内,每隔30秒执行onTimerFired:。这种场景一般出现在:  我需要在App启动之后,在一定时间内持续更新某项数据
@autoreleasepool {
    NSRunLoop * runLoop = [NSRunLoop currentRunLoop];
    NSTimer * udpateTimer = [NSTimer timerWithTimeInterval:30
                                                    target:self
                                                  selector:@selector(onTimerFired:)
                                                  userInfo:nil
                                                   repeats:YES];
    [runLoop addTimer:udpateTimer forMode:NSRunLoopCommonModes];
    [runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:60*30]];
}
上一篇 下一篇

猜你喜欢

热点阅读