RunLoop基本使用

2016-08-20  本文已影响44人  音吹

基本作用

入口

iOS中有Foundation和Core Foundation来使用RunLoop
Foundation:NSRunLoop
Core Foundation:CFRunLoopRef

概念

使用

//获取当前线程对应的RunLoop
NSRunLoop * currentRunLoop = [NSRunLoop currentRunLoop];

//获取当前线程对应的RunLoop
CFRunLoopRef runLoop  = CFRunLoopGetCurrent();
//之间的关系
runLoop = currentRunLoop.getCFRunLoop;

RunLoop相关类

Core Foundation中:

******系统默认注册了5个Mode
主要用的两个:

kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行
UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode影响

CFRunLoopTimerRef

CFRunLoopSourceRef

CFRunLoopObserverRef

/* Run Loop Observer Activities */
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
    kCFRunLoopEntry = (1UL << 0),         //即将进入Loop
    kCFRunLoopBeforeTimers = (1UL << 1),  //即将处理Timer
    kCFRunLoopBeforeSources = (1UL << 2), //即将处理Source
    kCFRunLoopBeforeWaiting = (1UL << 5), //即将进入休眠
    kCFRunLoopAfterWaiting = (1UL << 6),  //刚从休眠中唤醒
    kCFRunLoopExit = (1UL << 7),          //即将退出Loop
    kCFRunLoopAllActivities = 0x0FFFFFFFU
};
    //创建Observer
    /**
     *
     *
     *  @param kCFAllocatorDefault     默认分配内存空间
     *  @param kCFRunLoopAllActivities 监听什么状态,这个是监听所有状态
     *  @param YES                     是否持续监听
     *  @param 0                       优先级
     *  @param observer                回调
     *  @param activity                回调
     *
     *  @return return value description
     */
    CFRunLoopObserverRef observer =
    CFRunLoopObserverCreateWithHandler(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
        
        
        NSLog(@"---RunLoop状态发生改变----%zd",activity);
    });
    //添加观察者,监听RunLoop的状态
    CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
    
    //释放Observer
    CFRelease(observer);

给当前RunLoop添加source

    [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];
上一篇 下一篇

猜你喜欢

热点阅读