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

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

image

2.5 运行结果

[86588:453687] task1---<NSThread: 0x600000072b00>{number = 3, name = (null)}
[86588:453687] task2---<NSThread: 0x600000072b00>{number = 3, name = (null)}
[86588:453687] task2---<NSThread: 0x600000072b00>{number = 3, name = (null)}
[86588:453687] task2---<NSThread: 0x600000072b00>{number = 3, name = (null)}
[86588:453687] task2---<NSThread: 0x600000072b00>{number = 3, name = (null)}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值