IOS RunLoop 常驻线程的实现

线程常驻,正如其名,我们要实现的事让一个线程长期存在,不被销毁。

这时会有人说,那还不简单吗。

但是这里我们要实现的事如何让线程座椅待命,而且并不是主线程。

首先介绍一下正常情况下的线程使用。

//
//  ViewController.m
//  CX RunLoop 常驻线程的实现
//
//  Created by ma c on 16/3/30.
//  Copyright ? 2016年 xubaoaichiyu. All rights reserved.
//

#import "ViewController.h"
#import "CXThread.h"
@interface ViewController ()

@property (nonatomic, strong)CXThread * thread;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

     NSThread* thread = [[CXThread alloc]initWithTarget:self selector:@selector(run) object:nil];

    [thread start];

}
-(void)run{

    NSLog(@"run -- 旭宝爱吃鱼");

}
-(void)test{

    NSLog(@"test -- 旭宝爱吃鱼 %@",[NSThread currentThread]);

}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    [self test];

    //让test方法在线程thread上实现
//    [self performSelector:@selector(test) onThread:_thread withObject:nil waitUntilDone:nil];

}
@end

上面的代码知识简单的实现了线程的使用。

下面是其效果图(注意线程的销毁)

实际上test与thread并没有关系。

我知识简单的让其输出默认的主线程日志,以供后面对比。

下面是让thread为全局变量

//
//  ViewController.m
//  CX RunLoop 常驻线程的实现
//
//  Created by ma c on 16/3/30.
//  Copyright ? 2016年 xubaoaichiyu. All rights reserved.
//

#import "ViewController.h"
#import "CXThread.h"
@interface ViewController ()

@property (nonatomic, strong)CXThread * thread;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

     _thread = [[CXThread alloc]initWithTarget:self selector:@selector(run) object:nil];

    [_thread start];

}
-(void)run{

    NSLog(@"run -- 旭宝爱吃鱼");

}
-(void)test{

    NSLog(@"test -- 旭宝爱吃鱼 %@",[NSThread currentThread]);

}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    [self test];

    //让test方法在线程thread上实现
//    [self performSelector:@selector(test) onThread:_thread withObject:nil waitUntilDone:nil];

}
@end

由效果图我们可以发现。thread并没有销毁。而且test,依旧是在主线程上实现的。

但我们想要的是test在thread上实现(实际开发中是不允许耗时操作在主线程中的)

我们让test在thread中实现:(注意虾米那方法并不成功)

//
//  ViewController.m
//  CX RunLoop 常驻线程的实现
//
//  Created by ma c on 16/3/30.
//  Copyright ? 2016年 xubaoaichiyu. All rights reserved.
//

#import "ViewController.h"
#import "CXThread.h"
@interface ViewController ()

@property (nonatomic, strong)CXThread * thread;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

     _thread = [[CXThread alloc]initWithTarget:self selector:@selector(run) object:nil];

    [_thread start];

}
-(void)run{

    NSLog(@"run -- 旭宝爱吃鱼");

}
-(void)test{

    NSLog(@"test -- 旭宝爱吃鱼 %@",[NSThread currentThread]);

}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

//    让test方法在线程thread上实现
    [self performSelector:@selector(test) onThread:_thread withObject:nil waitUntilDone:YES];

}
@end

为什么会不成功呢??(我真的点击了)

原因是我们只是单纯的建立了一个线程。。。很单纯的。。。考虑一下我们该怎么做。

那么我们有两种做法实现。

方法一(比较正常的方法)

//
//  ViewController.m
//  CX RunLoop 常驻线程的实现
//
//  Created by ma c on 16/3/30.
//  Copyright ? 2016年 xubaoaichiyu. All rights reserved.
//

#import "ViewController.h"
#import "CXThread.h"
@interface ViewController ()

@property (nonatomic, strong)CXThread * thread;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

     _thread = [[CXThread alloc]initWithTarget:self selector:@selector(run) object:nil];

    [_thread start];

}
-(void)run{

    NSLog(@"run -- 旭宝爱吃鱼");
    //添加Port 实时监听
    [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
    //添加runloop
    [[NSRunLoop currentRunLoop]run];

}
-(void)test{

    NSLog(@"test -- 旭宝爱吃鱼 %@",[NSThread currentThread]);

}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

//    让test方法在线程thread上实现
    [self performSelector:@selector(test) onThread:self.thread withObject:nil waitUntilDone:NO];

}
@end

就是这么简单。

方法二

//
//  ViewController.m
//  CX RunLoop 常驻线程的实现
//
//  Created by ma c on 16/3/30.
//  Copyright ? 2016年 xubaoaichiyu. All rights reserved.
//

#import "ViewController.h"
#import "CXThread.h"
@interface ViewController ()

@property (nonatomic, strong)CXThread * thread;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

     _thread = [[CXThread alloc]initWithTarget:self selector:@selector(run) object:nil];

    [_thread start];

}
-(void)run{

    NSLog(@"run -- 旭宝爱吃鱼");

    while (1) {
        //添加runloop
        [[NSRunLoop currentRunLoop]run];
    }
}
-(void)test{

    NSLog(@"test -- 旭宝爱吃鱼 %@",[NSThread currentThread]);

}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

//    让test方法在线程thread上实现
    [self performSelector:@selector(test) onThread:self.thread withObject:nil waitUntilDone:NO];

}
@end

时间: 2024-10-07 05:31:33

IOS RunLoop 常驻线程的实现的相关文章

iOS之创建一个常驻线程

// 当创建一个线程,并且希望它一直存在时,但往往我们创建的线程都是执行完成之后也就停止了,不能再次利用,那么如何创建一个线程可以让他可以再次工作呢,这个时候就需要使用到RunLoop了.下面的是我写的一个例子:#import "LongThreadDemoController.h" @interface LongThreadDemoController () @property (nonatomic, strong) NSThread *thread; @end @implement

iOS Runloop理解

一.RunLoop的定义 当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程.RunLoop就是控制线程生命周期并接收事件进行处理的机制. RunLoop是iOS事件响应与任务处理最核心的机制,它贯穿iOS整个系统. Foundation: NSRunLoopCore Foundation: CFRunLoop 核心部分,代码开源,C 语言编写,跨平台 二.目的 通过RunLoop机制实现省电,流畅,响应速度快,用户体验好 三.理解 进程是一家工厂,线程是一个流水线,Run Loo

iOS RunLoop了解和使用

RunLoop 上次讲了runtime,这次是runloop,虽然两者都是run开头的名词术语,但是在OC中,这两个东西压根没啥联系.这篇文章主要讲讲runloop的一些概念和用法.其中包含: 什么runloop runloop是怎么存在的 runloop中包含哪些东西 日常开发中使用到runloop 的场景 一.什么是runloop 一个很容易想到的现象: 当我们将手机解锁进入某个APP之后,如果不操作手机(包括网络请求的行为),手机不会有任何反应,一旦我们进行了操作的时候,手机就会执行响应的

ios Runloop

一.概念:一个Runloop就是一个事件处理的循环,用来不停的调度工作和处理输入事件,使用runloop的目的是让你的线程在有工作的时候处于工作状态,没有工作的时候处于休眠状态. 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出.如果我们需要一个机制,让线程能随时处理事件但并不退出,通常的代码逻辑是这样的: 1 2 3 4 5 6 7 function loop() {     initialize();     do {         var message = get_nex

iOS RunLoop面试题

一 什么是RunLoop? 从字面意思看就是运行循环,其实内部就是do-while循环,这个循环内部不断地处理各种任务(比 如Source,Timer,Observer) 一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(run方法) RunLoop只能选择一个Mode启动,如果当前Mode中没有任何Source,Timer,Observer,那么就直接退出RunLoop 二 你在开发过程中怎么使用RunLoop?什么应用场景? 开启一个常驻线

浏览器内核常驻线程

浏览器内核常驻线程 浏览器 GUI 渲染线程 JavaScript 引擎线程 浏览器定时触发器线程 浏览器事件触发线程 浏览器 http 异步请求线程 浏览器 GUI 渲染线程 和 JavaScript 引擎线程之间是互斥的 在debug里面check一下如下代码的效果即可知道 var sleep = function(time) { var date = new Date(); while(new Date() - date <= time) {} } document.body.innerH

Java与iOS中的线程安全与线程同步

Java 中的线程安全与线程同步: 创建一个 Thread的实现类 MyThread , 作为线程体; 创建 Test 类, 在主函数中生成两个 Thread 对象, 两个对象公用一个线程体( MyThread 的对象 ); 线程安全: 避免多个线程同时访问统一资源; 解决办法: 加同步锁;  synchronized(this) { 要访问的资源; } iOS 中的线程安全与线程同步 线程安全: 同一资源在统一时间只能允许一个线程进行访问 解决办法: 方法一: 加同步锁 @synchroniz

iOS多线程技术—线程的状态

iOS多线程技术—线程的状态 一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil]; 说明:创建线程有多种方式,这里不做过多的介绍. 线程的开启: [self.thread start]; 线程的运行和阻塞: (1)设置线程阻塞1,阻塞2秒 [NSThread sleepForTimeInterval:2.0]; (2)第二种设置线程阻塞2,以当前时间

iOS runloop详解

写这篇文章开始之前,我都不知道runloop是什么东西,如果从字面的意思翻译应该是一直循环的跑,怀疑可能和死锁有关系,可是死锁具体是怎么回事,我只是记得有这个说法,也发现了一个自己不懂的知识. 初识runloop 我在网上看了一下@sunnnyxx 关于runloop的视频.了解了一下runloop相关知识,也去网络上看各种关于runloop的讲述. 我们一般程序就是执行一个线程,是一条直线,有起点终点,而runloop就是一直在线程上面画圆圈,一直在跑圈,除非切断否则一直在运行.网上说的比喻很