首页 > 其他 > 详细

RunLoop 初识

时间:2016-04-09 18:51:35      阅读:193      评论:0      收藏:0      [点我收藏+]

 

/*

 

 RunLoop 作用:

 *保证程序持续运行

 *处理App中的各种事件 (触摸 定时器 selector)

 *如果没人让App处理事件 RunLoop会进入休眠状态

 *节省CPU资源 提高程序性能. 该做事情的时候做事, 该休息的时候休息

 

*/

 

/*

 

RunLoop 在 iOS中有两套API

 *Foundation

 NSRunLoop

 

 *Core Foundation 大部分东西 都是C语言的

 NSRunLoop 封装了CFRunLoopRef

 *

 

*/

 

 

 

- (void)viewDidLoad {

    [super viewDidLoad];

 

    self.view.backgroundColor = [UIColor grayColor];

    

    /*

     RunLoop与线程的关系:

     每个线程都有一个与之对应的RunLoop

     主线程的RunLoop在程序启动是 自动创建

     子线程则需要你自己手动创建

     */

    

    //1.获取RunLoop (准确的说,是获取当前线程的RunLoop)

    [NSRunLoop currentRunLoop];

    //获取主线程的RunLoop

    [NSRunLoop mainRunLoop];

    

    //子线程的RunLoop(这是需要我们自己创建的)默认情况下NSTimer被加入NSDefalutRunLoopMode

   // 如果想NSTimer受到组件或者动画影响 添加到NSRunLoopCommonModes(OC代码如下:)

    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadAction) object:nil];

 

    [thread start];

    

    

    //2.mode 代表运行模式

    /*

     *RunLoop是有多个模式的,但是一个RunLoop只能选择一种模式运行, 如果想要切换模式,需要退出当前模式

     *如果选择一个模式执行, 则只能运行当前模式下的事件

     

     */

    /*

     kCFRunLoopDefaultMode 默认模式 主线程默认的模式

     UITrackingRunLoopMode 界面跟踪模式 ScrollView滑动时走的模式

     kCFRunLoopCommonModes 占位模式 (包含上面两种模式,若把事件添加到此模式下,事件在上面两种模式都可以响应)

     

    */

    

    

    [self timerAction];

    [self observer];

}

- (void)threadAction{

    //懒加载 创建RunLoop

//    NSLog(@"%@",[NSRunLoop currentRunLoop]);

}

 

- (void)timerAction{

//    [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(timerEvent:) userInfo:nil repeats:YES];

    

    NSTimer *timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(timerEvent:) userInfo:nil repeats:YES];

    

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode]; //UITrackingRunLoopMode界面跟踪模式 ScrollView滑动时走的模式 ??哈哈试一试

    /*

     NSDefaultRunLoopMode 默认模式 主线程默认的模式

     UITrackingRunLoopMode 界面跟踪模式 ScrollView滑动时走的模式

     NSRunLoopCommonModes 占位模式 (包含上面两种模式,若把事件添加到此模式下,事件在上面两种模式都可以响应)

     

     */

    

    

    

}

- (void)timerEvent:(NSTimer *)sender{

    NSLog(@"timer ??");

}

 

- (void)observer{

    //    CFRunLoopObserverRef 是观察者 监听RunLoop的状态

    /*

     

     typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {

     kCFRunLoopEntry = (1UL << 0),  即将进入RunLoop

     kCFRunLoopBeforeTimers = (1UL << 1),

     kCFRunLoopBeforeSources = (1UL << 2),

     kCFRunLoopBeforeWaiting = (1UL << 5), 休眠之前

     kCFRunLoopAfterWaiting = (1UL << 6),

     kCFRunLoopExit = (1UL << 7),

     kCFRunLoopAllActivities = 0x0FFFFFFFU

     };

     

     */

    

    

    // 创建observer

    CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {

        NSLog(@"----监听到RunLoop状态发生改变---%zd", activity);

    });

    

    // 添加观察者:监听RunLoop的状态

    CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);

    

    // 释放Observer

    CFRelease(observer);

    /*

     Core Foundation内存管理

     * 遇到Creat copy retain 等创建变量 需要对变量进行内存管理

     *在使用完之后 对其进行Release 调用CFRelease(释放的变量)

     */

}

 

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    NSLog(@"??");

}

 

RunLoop 初识

原文:http://www.cnblogs.com/LzwBlog/p/5372187.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!