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