线程通信
- 什么是线程间通信?
- 在1个进程中,线程往往不是孤立存在的,多个线程之间需要进行通信。
-线程通信之间的体现- 1个线程传递数据给另一个线程
- 在一个线程中执行完特定任后,转到另一个线程继续执行任务
例如:线程A需要线程B的一个结果,线程b将数据传递给线程A,这种两个线程之间交互数据的过程,就是线程通信;可到官方文档《线程编程指南》查看线程通信
NSThread线程间通信常用方法
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait
子线程调用该方法则回到主线程
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait
使用哪个线程执行
最典型的案例,是在线图片显示,一个子线程下载图片,下载完成后回到主线程显示
代码示例如下:
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSThread *downloadThread = [[NSThread alloc]initWithTarget:self selector:@selector(downloadImage) object:nil];
[downloadThread start];
}
-(void)showImag:(UIImage *)image{
if (image) {
self.imageView.image=image;
}
}
-(void)downloadImage{
NSString *imageUrlStr=@"https://t7.baidu.com/it/u=139984722,3523412696&fm=193&f=GIF";
NSURL *url = [NSURL URLWithString:imageUrlStr];
NSError *error=nil;
NSData *data = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached
error:&error];
UIImage *image=nil;
if (!error) {
image=[UIImage imageWithData:data scale:[UIScreen mainScreen].scale];
}
// [self performSelectorOnMainThread:@selector(showImag:) withObject:image waitUntilDone:YES];
//使用imageView可省略一步写showImage:方法
[self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
NSLog(@"%f",end-start);
}