为什么需要线程保活
在项目中,我们会把一些耗时的操作放到子线程去运行,防止界面卡顿。根据线程知识,如果子线程执行完分配的任务后,就会自动销毁。这种频繁创建和销毁的操作会浪费很多资源,所以我们要进行线程保活.
- 创建一个线程去执行任务,完成后线程会自动销毁
-
创建线程
-
执行任务
-
我们可以看到任务执行完成后线程自动销毁了
-
-
线程操作
- 创建子线程
- 开启runloop
a.关于开启线程的启动方式官方文档中提到有三种启动RunLoop的方法: - run 无条件进入是最简单的做法,但也最不推荐。这会使线程进入死循环,从而不利于控制 RunLoop. 其本质就是重复循环调用 runMode:beforeDate: - runUntilDate 如果我们设置了超时时间,那么 RunLoop 会在处理完事件或超时后结束,此时我们可以选择重新开启 RunLoop。这种方式要优于前一种 本质也是重复调用 runMode:beforeDate:,区别在于它超时后就不会再调用 - runMode:beforeDate: 这是相对来说最优秀的方式,相比于第二种启动方式,我们可以指定 RunLoop 以哪种模式运行 我们需要给runMode:beforeDate:加上一个循环,否则调用一次runloop就销毁了,达不到线程保活的目的3. 执行任务 4. 完成任务销毁线程
关闭runloop方法有2种 1.设置超时 2.CFRunLoopStop() 由于我们要精确的空值线程和runloop的销毁时间,所以我们选择CFRunLoopStop()方法关闭runloop