RunLoop

作者: zcApple | 来源:发表于2016-08-30 10:46 被阅读9次

    RunLoop理解为一个让程序保持持续运行状态的循环,处理程序中的各种事件,本质是一个do while死循环,但就是这个死循环保证我们的程序不死。

    • 启动程序默认创建的一个RunLoop对象,main函数永远不会有返回值,main函数不会结束,程序一直在运行中。
    int main(int argc, char * argv[]) {
        @autoreleasepool {
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
    }
    
    • 每条线程都有唯一的一个与之对应的RunLoop对象
      主线程默认创建有runloop对象,子线程要自己创建(用currentRunLoop方法创建并获取)
      RunLoop在第一次获取时创建,在线程结束时销毁
    //    CFRunLoopGetCurrent(); // [NSRunLoop currentRunLoop]  //获取当前runloop对象
    //    CFRunLoopGetMain();  // [NSRunLoop mainRunLoop]  // 获取主线程runloop对象
    
    • CFRunLoopModeRef
      kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行
      UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode影响
      kCFRunLoopCommonModes:这是一个占位用的Mode,不是一种真正的Mode,一种标签,kCFRunLoopDefaultMode和UITrackingRunLoopMode都有这种标签,所以设置这种mode时,上面两种状态下的事件都可以接收。


      RunLoop对象.png
    • CFRunLoopObserverRef
      CFRunLoopObserverRef是观察者,能够监听RunLoop的状态改变

    // 创建observer
        CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
            NSLog(@"----监听到RunLoop状态发生改变---%zd", activity);
        });
    
        // 添加观察者:监听RunLoop的状态
        CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
        
        // 释放Observer
        CFRelease(observer);
    
    typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
        kCFRunLoopEntry = (1UL << 0),
        kCFRunLoopBeforeTimers = (1UL << 1),
        kCFRunLoopBeforeSources = (1UL << 2),
        kCFRunLoopBeforeWaiting = (1UL << 5),
        kCFRunLoopAfterWaiting = (1UL << 6),
        kCFRunLoopExit = (1UL << 7),
        kCFRunLoopAllActivities = 0x0FFFFFFFU
    };
    
    • 常驻线程
      一般子线程都是在执行完某个任务后就销毁了,可以在这个线程内创建一个runloop对象,那么这个线程就就不会销毁,除非主动退出线程。
    [NSThread exit];
    

    要一个runloop对象能够一直运行下去,创建时必须给予一定的内容,不然创建之后会立即销毁。

    [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];
    
    • 定时器
    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
    

    // Creates and returns a new NSTimer object and schedules it on the current run loop in the default mode.
    如官方文档所述,等价于

    NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    

    学习笔记如有不正确的地方,欢迎各位大神指正!

    相关文章

      网友评论

          本文标题:RunLoop

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