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