Runloop线程保活

318 阅读1分钟

为什么需要线程保活

在项目中,我们会把一些耗时的操作放到子线程去运行,防止界面卡顿。根据线程知识,如果子线程执行完分配的任务后,就会自动销毁。这种频繁创建和销毁的操作会浪费很多资源,所以我们要进行线程保活.

  • 创建一个线程去执行任务,完成后线程会自动销毁
    1. 创建线程

    2. 执行任务

    3. 我们可以看到任务执行完成后线程自动销毁了 image.png

image.png

image.png

  • 线程操作

    1. 创建子线程
    2. 开启runloop
    a.关于开启线程的启动方式
    
    官方文档中提到有三种启动RunLoop的方法:
    - run 无条件进入是最简单的做法,但也最不推荐。这会使线程进入死循环,从而不利于控制 RunLoop. 
          其本质就是重复循环调用 runMode:beforeDate:
    - runUntilDate 如果我们设置了超时时间,那么 RunLoop 会在处理完事件或超时后结束,此时我们可以选择重新开启 RunLoop。这种方式要优于前一种
          本质也是重复调用 runMode:beforeDate:,区别在于它超时后就不会再调用
    - runMode:beforeDate: 这是相对来说最优秀的方式,相比于第二种启动方式,我们可以指定 RunLoop 以哪种模式运行
    我们需要给runMode:beforeDate:加上一个循环,否则调用一次runloop就销毁了,达不到线程保活的目的
    

    3. 执行任务 4. 完成任务销毁线程

    关闭runloop方法有21.设置超时
    2.CFRunLoopStop()
    由于我们要精确的空值线程和runloop的销毁时间,所以我们选择CFRunLoopStop()方法关闭runloop
    

image.png

image.png

image.png

image.png