博客> 浅显易懂的NSRunLoop
浅显易懂的NSRunLoop
2019-10-17 23:16 评论:0 阅读:224 Nathanile
ios NSRunloop Object-c NSRunTime

NSRunLoop是iOS消息机制的处理模式 一条线程对应一个RunLoop,主线程的RunLoop默认已经创建好,子线程需要手动创建 获取主线程对应的RunLoop对象:mainRunLoop/CFRunLoopGetMain 获取当前线程对应的RunLoop对象:currentRunLoop/CFRunLoopGetCurrent RunLoop会一直循环检测,从线程start到线程end,检测到事件源(CFRunLoopSourceRef)执行处理函数,首先会产生通知,coreFunction向线程添加RunLoopObservers来监听事件,并控制NSRunLoop里面线程的执行和休眠,在有事情做得时候使当前NSRunLoop控制的线程工作,没有事情做让当前NSRunLoop控制的线程休眠。 RunLoop的运行模式(CFRunLoopModeRef) 一个RunLoop包含若干个Mode,每个Mode又包含若干个Source/Timer/Observer;每次RunLoop启动时,只能指定其中一个Mode,这个Mode被称作CurrentMode;如果需要切换Mode,只能退出Loop,再重新指定一个Mode进入 系统默认模式

NSDefaultRunLoopMode:App的默认mode,通常主线程是在这个Mode下运行 UITrackingRunLoopMode:界面跟踪mode,用于scrollView追踪触摸滑动,保证界面滑动时不受其他mode影响 UIInitializationRunLoopMode:在刚启动App时进入的第一个Mode,启动后就不再使用 GSEventReceiveRunLoopMode:接受系统事件的内部mode,通常用不到 NSRunLoopCommonModes:这是一个占位用的Mode,不是一种真正的mode 新建NSTimer对象 NSTimer *timer = [NSTimer timerWithTimeInterval:5.0 target:self selector:@selector(show) userInfo:nil repeats:YES]; 将NSTimer添加到RunLoop中,并且告诉系统,当前Tiemr只有在RunLoop的默认模式下才有效 [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 所以在UITrackingRunLoopMode模式下,定时器的方法不会执行,但定时器仍计时 如果是通过scheduledTimerWithTimeInterval创建的NSTimer, 默认就会添加到RunLoop得DefaultMode中 , 所以它会自动运行

收藏
0
sina weixin mail 回到顶部