欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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 图示

iOS学习笔记-139.RunLoop08——Runloop应用之常驻线程

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)}