iOS开发——高级篇——线程保活

线程保活

顾名思义,就是保护线程不死(保证线程处于激活状态,生命周期没有结束)

正常情况,当线程执行完一次任务之后,需要进行资源回收,也就意味着生命周期结束

 

应用场景

当有一个任务,随时都有可能去执行它,那么应该放在子线程去执行,并且让子线程一直存活着,避免执行多次任务做多次创建销毁线程的动作,降低性能消耗

注意:只适用于非并发(一个线程嘛)

 

笔者利用runloop结合线程相关知识封装了一个小框架  https://github.com/chglog/CHGPermenantThread

提供三个接口:

/**
 开启线程,默认自动开启
 */
- (void)run;

/**
 在当前子线程执行一个任务
 */
- (void)executeTask:(CHGPermenantThreadTask)task;

/**
 结束线程,默认CHGPermenantThread销毁时自动结束线程
 */
- (void)stop;

 

 

用法:

    // 创建一个保活线程,直到ViewController销毁,或者主动调用stop
    self.thread = [[CHGPermenantThread alloc] init];

    [self.thread executeTask:^{
        // 你要在子线程里做的事情
        NSLog(@"执行任务 - %@", [NSThread currentThread]);
    }];
    // 主动销毁该子线程
    [self.thread stop];

 

OC版本核心实现代码:

self.innerThread = [[CHGThread alloc] initWithBlock:^{
            // 往RunLoop里面添加Source\Timer\Observer
            [[NSRunLoop currentRunLoop] addPort:[[NSPort alloc] init] forMode:NSDefaultRunLoopMode];
            
            // 只要没有主动或被动退出loop 那么就继续让loop跑起来
            while (weakSelf && !weakSelf.isStopped) {
                // 这个方法在没有任务时就睡眠  任务完成了就会退出loop
                [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
            }
        }];

 C语言版本核心实现代码:

self.innerThread = [[MJThread alloc] initWithBlock:^{

// 创建上下文(要初始化一下结构体) CFRunLoopSourceContext context = {0}; // 创建source CFRunLoopSourceRef source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context); // 往Runloop中添加source CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode); // 销毁source CFRelease(source); // 启动 CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0e10, false); }];

 

转载于:https://www.cnblogs.com/chglog/p/9585068.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值