线程间通讯

Posted 小课桌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程间通讯相关的知识,希望对你有一定的参考价值。

线程间通讯:把一个线程中计算的结果传递到另一个线程中使用。

示例场景:子线程下载网络图片,回主线程更新UI。

 

NSThread示例代码:

 1 - (void)viewDidLoad {
 2     [super viewDidLoad];
 3     
 4     // 子线程下载网络数据
 5     [self performSelectorInBackground:@selector(downloadImage) withObject:nil];
 6 }
 7 
 8 // 加载网络数据,耗时操作,在子线程中进行
 9 - (void)downloadImage {
10     NSURL *url = [NSURL URLWithString:@"http://c.hiphotos.baidu.com/image/pic/item/a044ad345982b2b782d814fd34adcbef76099b47.jpg"];
11     
12     NSData *data = [NSData dataWithContentsOfURL:url];
13     UIImage *img = [UIImage imageWithData:data];
14     
15     NSLog(@"%@-%@",img,[NSThread currentThread]);
16     
17     // 回主线程刷新UI
18     [self performSelectorOnMainThread:@selector(updateUI:) withObject:img waitUntilDone:NO];
19 }
20 
21 // 更新UI
22 - (void)updateUI:(UIImage *)img{
23     self.imgV.image = img;
24     [self.imgV sizeToFit];
25     [self.rootV setContentSize:img.size];
26     
27     NSLog(@"%@-%@",img,[NSThread currentThread]);
28 }

关键代码:

1     // 子线程下载网络数据
2     [self performSelectorInBackground:@selector(downloadImage) withObject:nil];
3     
4     // 回主线程刷新UI:子线程的运算结果传递到主线程中使用
5     [self performSelectorOnMainThread:@selector(updateUI:) withObject:img waitUntilDone:NO];

 

GCD示例代码:

 1 // 子线程下载网络数据
 2     dispatch_async(dispatch_get_global_queue(0, 0), ^{
 3         
 4         // 子线程中执行的代码
 5         NSURL *url = [NSURL URLWithString:@"http://c.hiphotos.baidu.com/image/pic/item/a044ad345982b2b782d814fd34adcbef76099b47.jpg"];
 6         
 7         NSData *data = [NSData dataWithContentsOfURL:url];
 8         UIImage *img = [UIImage imageWithData:data];
 9         
10         NSLog(@"%@-%@",img,[NSThread currentThread]);
11         
12         
13         // 回主线程更新UI
14         dispatch_async(dispatch_get_main_queue(), ^{
15             // 子线程中执行的代码
16             self.imgV.image = img;
17             [self.imgV sizeToFit];
18             [self.rootV setContentSize:img.size];
19             
20             NSLog(@"%@-%@",img,[NSThread currentThread]);
21         });
22     });

 

以上是关于线程间通讯的主要内容,如果未能解决你的问题,请参考以下文章

进程和线程的关系及区别,进程间如何通讯,线程间如何通讯

Java 线程间通讯

进程间通讯

Adnroid源码学习笔记:Handler 线程间通讯

线程间的通讯

Java 使用pipe进行线程间通讯