iOS学习笔记-139.RunLoop08——Runloop应用之常驻线程
程序员文章站
2022-05-16 10:24:18
runloop08——runloop应用之常驻线程
一、runloop应用
nstimer
imageview显示
performselector
常驻线程
自动释放池
第...
runloop08——runloop应用之常驻线程
一、runloop应用
nstimer
imageview显示
performselector
常驻线程
自动释放池
第一次创建:进入runloop的时候
最后一次释放:runloop退出的时候
其它创建和释放:当runloop即将休眠的时候会把之前的自动释放池释放,然后重新创建一个新的释放池
二、常驻线程
2.1 需求说明
我们希望有一个线程,能够执行我们提交的任务,并且这个线程是不会挂掉的。
按照我们正常的使用,那么任务执行完线程也就挂了。
如果我们在任务中添加了死循环,那么其他的任务这个线程就无法执行了。
说了那么多,那么到底怎么解决这个问题呢,不用怀疑,我们就用 runloop 来搞一把。
2.2 实现分析
我们想要使用 runloop 来实现上面的需求,我们最应该想起那个东西呢?
没错,就是我们 runloop 运行的条件:
runloop要想跑起来,它的内部必须要有一个mode,这个mode里面必须有source\observer\timer,至少要有其中的一个。
所以我们可以使用 nstimer 或者 cfrunloopsourceref
2.3 代码示例
// // viewcontroller.m // 03_uiview94_常驻线程 // // created by 杞文明 on 17/9/11. // copyright ? 2017年 杞文明. all rights reserved. // #import "viewcontroller.h" @interface viewcontroller () @property (nonatomic, strong) nsthread *thread; @end @implementation viewcontroller /*创建线程*/ - (ibaction)createthread:(id)sender { self.thread = [[nsthread alloc]initwithtarget:self selector:@selector(task1) object:nil]; [self.thread start]; } /*执行其他任务任务*/ - (ibaction)runothertask:(id)sender { [self performselector:@selector(task2) onthread:self.thread withobject:nil waituntildone:yes]; } -(void)task1{ nslog(@"task1---%@",[nsthread currentthread]); //1.获取当前线程对应的 runloop nsrunloop *runloop = [nsrunloop currentrunloop]; //2.为了保证runloop不退出 // //nstimer方式来实现 // nstimer *timer = [nstimer timerwithtimeinterval:2.0 repeats:yes block:^(nstimer * _nonnull timer) { // nslog(@"%s",__func__); // }]; // [runloop addtimer:timer formode:nsdefaultrunloopmode]; // cfrunloopsourceref 方式实现 [runloop addport:[nsport port] formode:nsdefaultrunloopmode]; //3.默认是没有开启的 [runloop run]; } -(void)task2{ nslog(@"task2---%@",[nsthread currentthread]); } @end
2.4 图示
2.5 运行结果
[86588:453687] task1---{number = 3, name = (null)} [86588:453687] task2---{number = 3, name = (null)} [86588:453687] task2---{number = 3, name = (null)} [86588:453687] task2---{number = 3, name = (null)} [86588:453687] task2---{number = 3, name = (null)}