美文网首页
iOS 常驻线程

iOS 常驻线程

作者: FieryDragon | 来源:发表于2020-08-26 18:37 被阅读0次

开启线程需要占用一定的内存空间(默认的情况下,主线程占1M,子线程占用512KB)且每次开辟子线程都会消耗CPU。如果频繁使用子线程的情况下,频繁开辟释放子线程会消耗大量的CPU和内存,而且创建的线程中的任务执行完成之后也就释放了,不能再次利用,所以造成资源和性能的浪费。这种情况下可以通过创建一个常驻线程来解决。

常驻线程通过NSThread与runloop来实现。新建的子线程默认没有开启runloop,因此需要给这个线程添加了一个runloop,并且加了一个NSMachPort端口监听,防止新建的线程由于没有活动直接退出。

常驻线程

#pragma mark- 异步常驻线程
+ (void)logThreadEntryPoint:(id)__unused object {
    @autoreleasepool {
        [[NSThread currentThread] setName:@"com.log.LOGServiceThread"];
        
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
        [runLoop run];
    }
}

+ (NSThread *)logThread {
    static NSThread *_logThread = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        _logThread = [[NSThread alloc] initWithTarget:self selector:@selector(logThreadEntryPoint:) object:nil];
        [_logThread start];
    });
    
    return _logThread;
}

使用

[self performSelector:@selector(token) onThread:[[self class] logThread] withObject:nil waitUntilDone:NO];

退出

[NSRunLoop currentRunLoop]removePort:<#(nonnull NSPort *)#> forMode:<#(nonnull NSRunLoopMode)#>

只有从runloop中移除我们之前添加的端口,这样runloop没有任何事件,所以直接退出。


  • 参考资料

基于runloop的线程保活、销毁与通信

相关文章

  • iOS:常驻线程

    常驻线程基本的思路都是等待信号>收到信号>执行回调>继续等待信号,在项目开发中需要将一些耗时的,不紧要的任务放到常...

  • iOS 常驻线程

    1.创建子线程并开启线程2.给当前runloop添加port并运行runloop3.将新任务添加到已休眠的线程

  • iOS 常驻线程

    开启线程需要占用一定的内存空间(默认的情况下,主线程占1M,子线程占用512KB)且每次开辟子线程都会消耗CPU。...

  • iOS RunLoop(一)

    级别: ★★☆☆☆标签:「iOS」「RunLoop」「线程常驻」作者: 陈彬审校: QiShare团队 前言:这篇...

  • iOS RunLoop

    RunLoop 应用:NSTimer、 PerformSelector、常驻线程iOS 中有两套API访问 Fo...

  • iOS 创建常驻线程

    最近看了一些关于常驻线程的文章,发现了一些问题,写此文章记录一下,如果有写的不对的地方,欢迎大神指出... 常驻线...

  • iOS RunLoop常驻线程

    常驻线程的作用: 让一个一直存在的子线程,等待其他线程发来消息,处理其他事件。 1.设置成全局的,如果是线程对象是...

  • iOS 创建常驻线程

    iOS中默认就有个主线程即mainThread,我们的UI线程指的就是主线程,一般都是在主线程中操作UI,从某个角...

  • iOS GCD常驻线程

    - (void)viewDidLoad { [super viewDidLoad]; [self perf...

  • iOS面试问题

    一: iOS常驻线程 二: AFNetWorking 2.0与3.0的区别 三: 当开的后台线程太多, 如何进行内...

网友评论

      本文标题:iOS 常驻线程

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