RunLoop

作者: Silence_xl | 来源:发表于2020-05-21 16:04 被阅读0次
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            NSLog(@"1");
            [self performSelector:@selector(test) withObject:nil afterDelay:0];
            NSLog(@"3");
        });
    }
    
    - (void) test{
        NSLog(@"2");
    }
    
    2020-05-21 15:54:30.507697+0800 Demo1[26980:1523527] 1
    2020-05-21 15:54:30.507889+0800 Demo1[26980:1523527] 3
    

    不会执行test方法主要是runloop没有开启。

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            NSLog(@"1");
            [[NSRunLoop currentRunLoop] run];
            [self performSelector:@selector(test) withObject:nil afterDelay:0];
            NSLog(@"3");
        });
    }
    
    - (void) test{
        NSLog(@"2");
    }
    
    2020-05-21 16:08:35.589099+0800 Demo1[27547:1556104] 1
    2020-05-21 16:08:35.589334+0800 Demo1[27547:1556104] 3
    2020-05-21 16:08:36.183748+0800 Demo1[27547:1556104] 1
    2020-05-21 16:08:36.184352+0800 Demo1[27547:1556104] 2
    2020-05-21 16:08:36.184524+0800 Demo1[27547:1556104] 3
    

    1、全局变量保存各个线程和各个 RunLoop 对象的关系,初始化的时候创建一个主线程的 RunLoop 。
    2、子线程的 RunLoop 获取的时候开始创建。
    3、RunLoop 的生命周期和线程的生命周期有关系!

    Runloop
    • 循环运行 内部核心其实就是一个do while循环
    基本作用
    • 保持程序的持续运行
    • 处理App中的各种事件(比如触摸事件、定时器事件、Selector事件)
    • 节省CPU资源,提高程序性能,做事的时候跑起来,不做的时候休眠
    Runloop与线程
    • 每条线程都有唯一的一个与之对应的runloop对象
    • 主线程的runloop自动创建,子线程的runloop需要手动创建,不创建就没有
    • Runloop在第一次获取时创建,在线程结束时销毁
    获取runloop对象

    Fundation

    • [NSRunLoop currentRunLoop] // 获取当前线程的
    • [NSRunLoop mainRunLoop]// 获取主线程

    core fundation

    • CFRunLoopGetCurrent();// 获取当前线程
    • CFRunLoopGetMain(); // 获取主线程
    RunLoop整体逻辑
    image.png
    image.png

    相关文章

      网友评论

          本文标题:RunLoop

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