iOS开发实用技术iOS

RunLoop(一)

2019-04-12  本文已影响10人  dandelionYD

面试题

1.讲讲runloop,项目中有用?
2.runloop的内部实现?
3.runloop和线程的关系?
4.timer和runloop的关系?
5.程序中添加每3秒响应一次的NSTimer,当拖动tableview时timer可能无法响应要怎么解决? 
6.runloop是怎么响应用户操作的,具体流程是什么样的? 
7.说说runLoop的几种状态 
8.runloop的mode作用是什么? 

在下面的文章里面,我们一一介绍
本文Demo代码可见gitHub_Demo

PS:如果想看更加具体的 详见:深入理解RunLoop

https://opensource.apple.com/tarballs/CF/

runloop_02.png

下面我们具体的分析


下面我们通过代码来看看

-(void)creatObserver1{
    //创建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--即将进入Loop");
            break;
        case kCFRunLoopBeforeTimers:
            NSLog(@"kCFRunLoopBeforeTimers--即将处理 Timer");
            break;
        case kCFRunLoopBeforeSources:
            NSLog(@"kCFRunLoopBeforeSources--即将处理 Source");
            break;
        case kCFRunLoopBeforeWaiting:
            NSLog(@"kCFRunLoopBeforeWaiting-- 即将进入休眠");
            break;
        case kCFRunLoopAfterWaiting:
            NSLog(@"kCFRunLoopAfter-(void)creatObserver2{Waiting-- 刚从休眠中唤醒");
            break;
        case kCFRunLoopExit:
            NSLog(@"kCFRunLoopExit--即将退出Loop");
            break;
        default:
            break;
    }
}

============================================================
-(void)creatObserver2{
    //创建Observer
    CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
        switch (activity) {
            case kCFRunLoopEntry: {
                CFRunLoopMode mode = CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent());
                NSLog(@"kCFRunLoopEntry - 即将进入Loop %@", mode);
                CFRelease(mode);
                break;
            }
            case kCFRunLoopBeforeTimers: {
                CFRunLoopMode mode = CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent());
                NSLog(@"kCFRunLoopBeforeTimers - 即将处理 Timer %@", mode);
                CFRelease(mode);
                break;
            }
                
            case kCFRunLoopBeforeSources: {
                CFRunLoopMode mode = CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent());
                NSLog(@"kCFRunLoopBeforeSources -即将处理 Source  %@", mode);
                CFRelease(mode);
                break;
            }
                
            case kCFRunLoopBeforeWaiting: {
                CFRunLoopMode mode = CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent());
                NSLog(@"kCFRunLoopBeforeWaiting - 即将进入休眠 %@", mode);
                CFRelease(mode);
                break;
            }
                
            case kCFRunLoopAfterWaiting: {
                CFRunLoopMode mode = CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent());
                NSLog(@"kCFRunLoopAfterWaiting - 刚从休眠中唤醒 %@", mode);
                CFRelease(mode);
                break;
            }
                
            case kCFRunLoopExit: {
                CFRunLoopMode mode = CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent());
                NSLog(@"kCFRunLoopExit - 即将退出Loop %@", mode);
                CFRelease(mode);
                break;
            }
            default:
                break;
        }
    });
    // 添加Observer到RunLoop中
    CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopCommonModes);
    // 释放
    CFRelease(observer);
}

友情链接:

上一篇 下一篇

猜你喜欢

热点阅读