iOS开发-使用Runloop实现线程保活、线程常驻
来源:互联网 发布:火猫解说 收入 知乎 编辑:程序博客网 时间:2024/05/29 19:04
保证线程的长时间存活
在iOS开发过程中,有时一些花费时间比较长的操作阻塞主线程,导致界面卡顿,那么我们就会创建一个子线程,然后把这些花费时间比较长的操作放在子线程中来处理。可是当子线程中的任务执行完毕后,子线程就会被销毁掉。
首先,我们创建一个testThread类,继承自NSThread,然后重写dealloc 方法。
@interface testThread : NSThread@end@implementation testThread- (void)dealloc{ NSLog(@"%s",__func__);}@end
- (void)viewDidLoad { [super viewDidLoad]; // 测试线程 [self threadTest];}- (void)threadTest{ testThread *subThread = [[testThread alloc] initWithTarget:self selector:@selector(subThreadAction) object:nil]; [subThread start];}- (void)subThreadAction{ @autoreleasepool { NSLog(@"%@----子线程任务开始",[NSThread currentThread]); [NSThread sleepForTimeInterval:2.0]; NSLog(@"%@----子线程任务结束",[NSThread currentThread]); }}
当子线程中的任务执行完毕后,线程就被立刻销毁了。
如果程序中,需要经常在子线程中执行任务,频繁的创建和销毁线程,会造成资源的浪费。
这时候我们就可以使用RunLoop来让该线程长时间存活而不被销毁。
#import "SubViewController.h"#import "testThread.h"@interface SubViewController ()@property(nonatomic,strong) testThread* ttThread;@end@implementation SubViewController- (void)viewDidLoad { [super viewDidLoad]; // 测试线程 [self threadTest];}- (void)threadTest{ testThread *subThread = [[testThread alloc] initWithTarget:self selector:@selector(subThreadEnter) object:nil]; [subThread setName:@"测试线程"]; [subThread start]; self.ttThread = subThread;}/** 子线程任务 */- (void)subThreadAction{ NSLog(@"启动RunLoop后--%@",[NSRunLoop currentRunLoop].currentMode); NSLog(@"%@----子线程任务开始",[NSThread currentThread]); for (int i=0; i<300; i++) { [NSThread sleepForTimeInterval:1.0]; NSLog(@"----子线程任务 %ld",(long)i); } NSLog(@"%@----子线程任务结束",[NSThread currentThread]);}/** 子线程启动后,启动runloop */- (void)subThreadEnter{ @autoreleasepool { NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; //如果注释了下面这一行,子线程中的任务并不能正常执行 [runLoop addPort:[NSMachPort port] forMode:NSRunLoopCommonModes]; NSLog(@"启动RunLoop前--%@",runLoop.currentMode); [runLoop run]; }}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ [self performSelector:@selector(subThreadAction) onThread:self.ttThread withObject:nil waitUntilDone:NO];}@end
1.获取RunLoop只能使用 [NSRunLoop currentRunLoop] 或 [NSRunLoop mainRunLoop];
2.即使RunLoop开始运行,如果RunLoop 中的 modes 为空,或者要执行的mode里没有item,那么RunLoop会直接在当前loop中返回,并进入睡眠状态。
3.自己创建的Thread中的任务是在kCFRunLoopDefaultMode这个mode中执行的。
4.在子线程创建好后,最好所有的任务都放在AutoreleasePool中。
如果不执行下列语句:
[runLoop addPort:[NSMachPort port] forMode:NSRunLoopCommonModes];
执行下列语句:
[runLoop addPort:[NSMachPort port] forMode:NSRunLoopCommonModes];
可以看出我们添加了一个source0,这样runloop才运行起来。
其实这个例子只是简单制造一个常驻内存的线程,但是这个线程并不好控制结束,可以参考我的另外一篇文章iOS开发-RunLoop的退出方式。
- iOS开发-使用Runloop实现线程保活、线程常驻
- iOS RunLoop常驻线程
- IOS RunLoop 常驻线程的实现
- 利用runloop开启常驻线程
- 常驻子线程实现(iOS oc)
- iOS 开启常驻线程
- 基于runloop的线程保活、销毁与通信
- 基于runloop的线程保活、销毁与通信
- GCD、线程间通信、Runloop - iOS开发
- iOS学习笔记-140.RunLoop08——Runloop应用之常驻线程
- ios下使用runloop阻塞线程
- runloop实现原理初解 和 使用runloop阻塞线程
- 使用runloop阻塞线程
- Mac&iOS之多线程runloop
- ios开发进阶之多线程03 RunLoop 网络编程
- iOS runloop 详解3 如何停止子线程的runloop
- !浏览器内核常驻线程
- iOS之多线程---Runloop和多线程
- vue.js之v-text 与 v-html
- linux_简介 grep
- linux中管理系统分区汇总
- Java虚拟机第二章2.3 学习笔记
- 利用 iPhone X 的脸部识别能力为内容制作工作服务
- iOS开发-使用Runloop实现线程保活、线程常驻
- jlink gdb server with arm-none-eabi-gdb
- 配置方法数超过64k应用的问题
- sparksql优化1(小表大表关联优化 & union替换or)
- 详解python中的浅拷贝和深拷贝
- Web Scraping with Python: 使用 Python 下载 CSDN 博客图片
- android加载网络图片之前获取图片信息
- node.js-ORM数据库框架sequelize使用总结 超时查询、缓存查询、多表关联查询
- OpenCV中的videowriter