IOS开发多线程编程NSThread的使用方法

释放双眼,带上耳机,听听看~!

在ios应用程序的开发中,NSThread多线程是日常使用的知识,也是ios中的重要内容,今天技术狗为您介绍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];

上面就是技术狗小编给大家介绍的IOS多线程编程NSThread的使用方法,技术狗发布的文章都是比较靠谱的,希望这篇文章能够帮助到大家。

人已赞赏
iOS文章

iOS开发链式编程

2020-1-31 17:27:48

iOS文章

iOS系统NotificationCenter通用名称

2020-1-31 19:16:03

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索