IOS NSTimer和RunLoop问题
2019-11-20 本文已影响0人
maskerII
一、 RunLoop和线程关系
1.runLoop和线程是紧密关联的,可以说是为了线程而生,没有线程,RunLoop也没有存在的必要
2.runLoop和线程是一一对应的,主线程的runLoop默认是创建的,子线程的需要手动创建。currentRunLoop懒加载的,在同一个子线程中创建多个runloop,则返回的都是同一个对象,因为其是懒加载模式的
3.在runloop中有多个运行模式,但是runloop只能选择一种模式运行,mode里面至少要有一个timer或者是source
4.在第一次获取时创建,在线程结束时销毁
获得主线程的runLoop:NSRunLoop *mainRunLoop =[NSRunLoop mainRunLoop];
获得当前线程runLoop:NSRunLoop *currentRunLoop =[NSRunLoop currentRunLoop];
二、 NSTimer 在 RunLoop中使用
1.scheduled创建
+ (NSTimer *)scheduledTimerWithTimeInterval: (NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block
通过scheduled创建,默认加入到当前RunLoop里的,指定模式为NSDefaultRunLoopMode
如果在主线程里创建,需要修改下Mode为NSRunLoopCommonModes,不然,当滚动事件发生时,会导致NSTimer不执行,主线程的RunLoop是默认开启的,所以不需要[[NSRunLoop currentRunLoop] run]
如果在子线程里创建,且当前线程里无滚动事件,则不需要修改Mode,子线程的RunLoop默认不开启的,最好加上[[NSRunLoop currentRunLoop] run]
2.timerWithTimeInterval 创建
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block
这种方式创建不会自动加入RunLoop,需要手动加入
如果在主线程里创建,需要修改下Mode为NSRunLoopCommonModes,不然,当滚动事件发生时,会导致NSTimer不执行,主线程的RunLoop是默认开启的,所以不需要[[NSRunLoop currentRunLoop] run]
如果在子线程里创建,且当前线程里无滚动事件,则不需要修改Mode,子线程的RunLoop默认不开启的,最好加上[[NSRunLoop currentRunLoop] run]