美文网首页
12.runloop问题

12.runloop问题

作者: ProfessorFan | 来源:发表于2022-05-22 07:06 被阅读0次

问题

1.个人对runloop的理解
2.runloop 运行逻辑
3.监听runloop 的模式
4.获取当前子线程中的runloop 整么做
5.mainRunloop 和 CFRunloopGetMain() 有什么不一样

答案

1.个人对runloop的理解

1.runloop 在我们IOS程序中一直存在,只要app 不死就一直存在(里面相当于一个do-while一直在那里运行等待监听做事情)
2.一个IOS程序最起码有一个 runloop (也就是mainRunloop).
3.每一个线程对应一个 runloop
4.一个runloop 某一时刻只能有一个model
5.Runloop Model 实际上是 source ,Timer,Observer 的集合,不同的model 把不同组的 source,timer,observer隔绝起来,runloop在某一时刻只能跑在一个model下,处理这一个model 当中的 source ,timer,observer.
6.apple 文档中提到的五个model,分别是

NSDefaultRunLoopMode //默认的mode,正常情况下都是在这个mode
NSConnectionReplyMode
NSModalPanelRunLoopMode
NSEventTrackingRunLoopMode //使用这个Mode去跟踪来自用户交互的事件(比如UITableView上下滑动)
NSRunLoopCommonModes // 这个model 是 (NSEventTrackingRunLoopMode,NSDefaultRunLoopMode)集合

6.Runloop Model 里面结构的作用.
source: 可以唤醒Runloop 的一些事件,比如用户点击了屏幕,source0 :非系统事件,source1:系统事件
Timer: 我们经常使用的NSTimer 也就属于这一类
Observer: 可以用来经停Runloop 的状态变化,并做出反应

2.runloop 运行逻辑

runloop运行逻辑.png
runloop.png

3.监听runloop 的模式

1.方式一(通过C语言方式)

   // kCFRunLoopCommonModes默认包括kCFRunLoopDefaultMode、UITrackingRunLoopMode
    // 创建Observer
    CFRunLoopObserverRef observer = CFRunLoopObserverCreate(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, observeRunLoopActicities, NULL);
//    // 添加Observer到RunLoop中
    CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopCommonModes);
//    // 释放
    CFRelease(observer);

void observeRunLoopActicities(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info)
{
    switch (activity) {
        case kCFRunLoopEntry:
            NSLog(@"kCFRunLoopEntry");
            break;
        case kCFRunLoopBeforeTimers:
            NSLog(@"kCFRunLoopBeforeTimers");
            break;
        case kCFRunLoopBeforeSources:
            NSLog(@"kCFRunLoopBeforeSources");
            break;
        case kCFRunLoopBeforeWaiting:
            NSLog(@"kCFRunLoopBeforeWaiting");
            break;
        case kCFRunLoopAfterWaiting:
            NSLog(@"kCFRunLoopAfterWaiting");
            break;
        case kCFRunLoopExit:
            NSLog(@"kCFRunLoopExit");
            break;
        default:
            break;
    }
}

2.方式二(通过OC方式,也就是block方式)

  // 创建Observer
    CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
        switch (activity) {
            case kCFRunLoopEntry: {
                CFRunLoopMode mode = CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent());
                NSLog(@"kCFRunLoopEntry - %@", mode);
                CFRelease(mode);
                break;
            }
                
            case kCFRunLoopExit: {
                CFRunLoopMode mode = CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent());
                NSLog(@"kCFRunLoopExit - %@", mode);
                CFRelease(mode);
                break;
            }
                
            default:
                break;
        }
    });
    // 添加Observer到RunLoop中
    CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopCommonModes);
    // 释放
    CFRelease(observer);

4.获取当前子线程中的runloop 整么做

[NSRunLoop currentRunLoop];

5.mainRunloop 和 CFRunloopGetMain() 有什么不一样

mainRunloop 的实质也是 CFRunloopGetMain ,mainRunloop 是对 CFRunloopGetMain的封装

相关文章

  • 12.runloop问题

    问题 1.个人对runloop的理解2.runloop 运行逻辑3.监听runloop 的模式4.获取当前子线程中...

  • 问题,不是问题;问题,还是问题

    问题,不是问题 今天,是到新校舍的第一天。没水没电没床铺,教室里连黑板都没有。面对诸多问题,幸运的是...

  • 问题问题还是问题?

    问题实在是太多了!菜要这样做,不这样做是问题;饭没煮好,也是问题;自己不知道学会搞吃的也是问题;生活好像只剩下无尽...

  • 问题不是问题,如何对待问题才是问题。

    这几天身体状态一直不太好,反复头疼,但仍然坚持上课,我知道我要什么。我渴望找到那个自由绽放的自己。 早上怀着期待的...

  • “问题”不是问题,认为“是问题”才是问题

    大概从一个多星期前,腹部就开始有间断的疼痛感了,有时甚至会很难受。这种感觉在今天上午坐车时达到了最强烈,我简直不知...

  • 问题不是问题,怎样看问题才是问题。

    焦点幸福教师 坚持分享第1349天2020.11.17周二 小风波 1.购物 最近布置班级文化,我从网上购...

  • 问题的问题

    “你别总给我说问题、问题,给我提一些建设性的建议行不?” “你咋变成了意见篓子?” 满腔热血地跑到领导面前表功,结...

  • 问题的问题

    “你别总给我说问题、问题,给我提些建设性的建议行不?” “你咋变成了意见篓子?” 满腔热血地跑到领导面前表功,结果...

  • 问题不是问题!?

    创45:3-5 约瑟对他弟兄们说:“我是约瑟,我的父亲还在吗?”他弟兄不能回答,因为在他面前都惊惶。约瑟又对他弟兄...

  • 问题的问题

    问题家庭的问题是:家长本身用着有问题的方法教育孩子,没问题的孩子也变得有问题。 而且更严重的问题是:家长并没有意识...

网友评论

      本文标题:12.runloop问题

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