美文网首页
runloop学习的一些总结

runloop学习的一些总结

作者: mengshuobuyi | 来源:发表于2016-08-25 16:51 被阅读15次

目前网络上关于runloop的学习资料不是很多,比较系统的有YYKit的作者写的一篇博文阳神的博文。下面分享一下自己对这块知识的理解。

runloop与我们日常开发相关并不是太大,但涉及到性能优化这方面,它是无论如何都绕不过去的。

目前我理解的有两方面,第一个是线程保活,管理,另一个是可以把一些可以延后的必需要在主线程完成的工作移到runloop空闲的时候去做。

首先第一方面,借用AFN的代码-

static NSThread *_networkRequestThread = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        _networkRequestThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkRequestThreadEntryPoint:) object:nil];
        [_networkRequestThread start];
    });
    return _networkRequestThread;
  @autoreleasepool {
        [[NSThread currentThread] setName:@"AFNetworking"];
        
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
        [runLoop run];
    }

这边创建了一个单例线程,并插入了一个machPort使它一直存活,然后我们就可以通过访问该线程对任务进行管理,如下

[self performSelector:@selector(dowork) onThread:(你创建的单例线程) withObject:nil waitUntilDone:NO modes:@[NSDefaultRunLoopMode]];

第二方面是进行性能优化的,关于runloop的循环这里不多讲了,可以看上面的博客。可以知道,在两个时候runloop是空闲的,一个是RunLoopEntry,一个是RunLoopBeforeWaiting。

我们可以添加一个observer,观察runloop的状态。

CFRunLoopRef runloop = CFRunLoopGetMain();
    CFStringRef runloopMode = kCFRunLoopDefaultMode;
    CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(kCFAllocatorDefault, kCFRunLoopBeforeWaiting| kCFRunLoopEntry, true, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
        if (给一个判断条件) {//移除ob的条件
            CFRunLoopRemoveObserver(runloop, observer, runloopMode);
            CFRelease(observer);
            return;
        }      
        [self performSelector:@selector(testDo:) onThread:[NSThread mainThread] withObject:obj waitUntilDone:NO modes:@[NSDefaultRunLoopMode]];
    });
    CFRunLoopAddObserver(runloop, observer, runloopMode);

切记一定要在主线程!

水平有限,请大家不吝赐教!

相关文章

  • RunLoop的一些学习与总结

    最近在学习一些OC底层的东西, 下面是学习了RunLoop的一些总结和感受^^ 首先,RunLoop的作用 从字面...

  • RunLoop 的相关概念

    此篇为对 RunLoop 的相关概念的总结,主要介绍 RunLoop 的一些概念 RunLoop 简介 RunLo...

  • runloop学习的一些总结

    目前网络上关于runloop的学习资料不是很多,比较系统的有YYKit的作者写的一篇博文,阳神的博文。下面分享一下...

  • NSRunLoop

    前言 RunLoop的初期学习总结,后续会持续研究更新。 一、Runloop定义及作用 1. 什么是Runloop...

  • iOS- Runloop浅谈

    最近项目完成年前的时间也比较轻松,对一些知识就行总结。今天总结的是Runloop.对于Runloop,在平时项目中...

  • RunLoop学习总结

    RunLoop的定义 当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程。RunLoop就是控制线程...

  • RunLoop学习总结

    简介 Runloop可以保证程序会一直运行并且时时刻刻在等待用户的输入操作。RunLoop可以在需要的时候运行,在...

  • Runloop学习总结

    什么是Runloop · 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让...

  • RunLoop学习总结

    什么是RunLoop 从字面上看,就是运行循环,跑圈 其实它内部就是do-while循环,在这个循环内部不断地处理...

  • RunLoop学习总结

    通过以下文章学习记录 关于Runloop的原理探究及基本使用 深入理解RunLoop RunLoop完全指南 Ru...

网友评论

      本文标题:runloop学习的一些总结

      本文链接:https://www.haomeiwen.com/subject/wwrasttx.html