IOS多线程编程NSThread的使用方法
IOS多线程编程NSThread的使用方法
NSThread是多线程的一种,有两种方法创建子线程
(1)优点:NSThread 比GCD、NSOperation都轻量级
(2)缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销
第一种是隐藏创建,有以下几种方式:
(1)多用于串行:- (id)performSelector:(SEL)aSelector withObject:(id)object;
(2)后台执行,多用于并行:- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg;
(3)延迟执行:- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
(4)回到主线程执行:- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
注意:
(1)通过方法" + (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument; ",或"+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget"停止执行;
示例:
//创建子线程-隐式方法
// 子线程-串行 [self performSelector:@selector(showCount:) withObject:@(11)]; [self performSelector:@selector(showCount:) withObject:@(12)]; [self performSelector:@selector(showCount:) withObject:@(23)];
// 子线程-并行(后台) [self performSelectorInBackground:@selector(showCount:) withObject:@(41)]; [self performSelectorInBackground:@selector(showCount:) withObject:@(42)];
// 回到主线程 [self performSelectorOnMainThread:@selector(showCount:) withObject:@(51) waitUntilDone:YES];
// 子线程延迟执行 [self performSelector:@selector(showCount:) withObject:@(61) afterDelay:5.0];
// 停止 [NSObject cancelPreviousPerformRequestsWithTarget:self];
第二种是显示创建,方式如下:
- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument;
注意:
(1)通过方法" - (void)start; "开始执行;
(2)通过方法" - (void)cancel; "停止执行;
示例:
//创建子线程-显示方法
self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(showCount:) object:@(61)]; self.thread.name = @"计数"; [self.thread start]; [self.thread cancel];
代码示例
- (void)showCount:(NSNumber *)number { NSInteger count = arc4random() % 1000; count = 1000; for (int i = 0; i < count; i++) { NSLog(@"第 %@ 个 i = %@", number, @(i)); // 休眠n秒再执行 [NSThread sleepForTimeInterval:0.2]; // 停止 // BOOL isStop = [self.thread isCancelled]; // if (isStop) // { // NSLog(@"2 停止"); // break; // } if (isCancelThread) { NSLog(@"2 停止"); break; } } }
bool isCancelThread = NO; - (void)stopClick { [NSObject cancelPreviousPerformRequestsWithTarget:self]; if (self.thread) { BOOL isExecuting = [self.thread isExecuting]; if (isExecuting) { NSLog(@"1 停止"); // [self.thread cancel]; isCancelThread = YES; } } }
- (void)downloadImage:(NSString *)imageUrl { NSURL *url = [NSURL URLWithString:imageUrl]; NSData *data = [[NSData alloc] initWithContentsOfURL:url]; UIImage *image = [[UIImage alloc] initWithData:data]; if (image == nil) { } else { // [self performSelectorOnMainThread:@selector(updateImage:) withObject:image waitUntilDone:YES]; [self performSelectorInBackground:@selector(updateImage:) withObject:image]; } // NSURL *url = [NSURL URLWithString:imageUrl]; // NSURLRequest *request = [NSURLRequest requestWithURL:url]; // NSURLSession *session = [NSURLSession sharedSession]; // NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) { // // // 输出返回的状态码,请求成功的话为200 // NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; // NSInteger responseStatusCode = [httpResponse statusCode]; // NSLog(@"%ld", responseStatusCode); // // UIImage *image = [UIImage imageWithData:data]; //// [self performSelectorOnMainThread:@selector(updateImage:) withObject:image waitUntilDone:YES]; // [self performSelectorInBackground:@selector(updateImage:) withObject:image]; // }]; // // // 使用resume方法启动任务 // [dataTask resume]; }
- (void)updateImage:(UIImage *)image { self.imageview.image = image; // self.imageview = [[UIImageView alloc] initWithFrame:CGRectMake(10.0, 10.0, (CGRectGetWidth(self.view.bounds) - 10.0 * 2), (CGRectGetWidth(self.view.bounds) - 10.0 * 2))]; // [self.view addSubview:self.imageview]; // self.imageview.backgroundColor = [UIColor colorWithWhite:0.5 alpha:0.2]; // // self.imageview.image = image; }
NSString *imageUrl = @"http://ww1.sinaimg.cn/crop.0.0.1242.1242.1024/763fb12bjw8empveq3eq8j20yi0yiwhw.jpg"; // 隐藏创建 // [self performSelectorInBackground:@selector(downloadImage:) withObject:imageUrl]; [self performSelectorOnMainThread:@selector(downloadImage:) withObject:imageUrl waitUntilDone:YES]; // 创建子线程-显示方法 self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(downloadImage:) object:imageUrl]; self.thread.name = @"imageDownload"; [self.thread start];
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
- 响应式js幻灯片代码一枚
- 使用深度学习检测面部特征,让实时视频聊天变得更有趣
- springboot 注册服务注册中心(zk)的两种方式
- 极速体验:Oracle 18c 下载和Scalable Sequence新特性
- springboot mybatis 事务管理
- Elasticsearch JAVA api轻松搞定groupBy聚合
- 微信加关注链接 一键关注公众号 解决用手机看网页无法扫二维码的烦恼
- springboot mybatis redis 二级缓存
- Elasticsearch强制重置未分配的分片(unassigned)
- 帝国cms调用缩略图和具体文章的方法
- python codis集群客户端(一) - 基于客户端daemon探活与服务列表维护
- python codis集群客户端(二) - 基于zookeeper对实例创建与摘除
- JavaScript replace() 方法
- 别让Open Sans字体拖慢wordpress后台速度
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Android开发实现生成excel的方法详解
- Android ToolBar 修改边距的实现方法
- Android 自定义view实现TopBar效果
- Android 客户端RSA加密的实现方法
- Android圆形头像拍照后“无法加载此图片”的问题解决方法(适配Android7.0)
- Android 中Failed to read key from keystore解决办法
- Android圆角按钮的制作方法
- Android计时器控件Chronometer应用实例
- Android 中利用 ksoap2 调用 WebService的示例代码
- Android自定义View展示Wifi信号强弱指示方法示例
- android事件分发机制的实现原理
- Android 在子线程中更新UI的几种方法示例
- WebView设置WebViewClient的方法
- Android星级评分条的实现代码
- Android模仿美团顶部的滑动菜单实例代码