首页 > 代码库 > 线程间通讯
线程间通讯
线程间通讯:把一个线程中计算的结果传递到另一个线程中使用。
示例场景:子线程下载网络图片,回主线程更新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 =http://www.mamicode.com/ [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 =http://www.mamicode.com/ [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 });
线程间通讯
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。