线程间的通信主要用于主线程与子线程的,也有用于子线程与子线程的

介绍下面几种通信方式

1.利用GCD方式(推荐)

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//开一个子线程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//下载图片 NSURL *url = [NSURL URLWithString:@"http://e.hiphotos.baidu.com/image/pic/item/14ce36d3d539b600be63e95eed50352ac75cb7ae.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *img = [UIImage imageWithData:data]; dispatch_async(dispatch_get_main_queue(), ^{
//回到主线程
self.imgVIew.image = img;
}); //在这里使用同步还是异步,区别是前者是按顺序依次执行,后者是先执行到最后再回到主线程
NSLog(@"________");
});
}

利用这种方式可以轻松地控制线程间的跳转通信

2.利用系统方法

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    //创建子线程
[self performSelectorInBackground:@selector(downLoad) withObject:nil];
} //在子线程中下载图片
- (void)downLoad { NSURL *url = [NSURL URLWithString:@"http://e.hiphotos.baidu.com/image/pic/item/e7cd7b899e510fb34395d1c3de33c895d0430cd1.jpg"]; NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *img = [UIImage imageWithData:data]; //下载完毕,返回给主线程图片
[self.imgVIew performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:img waitUntilDone:YES]; }

补充:也可以使用

[self performSelectorOnMainThread:@selector(setImg:) withObject:img waitUntilDone:YES];这个方法返回主线程图片

@selector(这里面其实就是主线程中image属性的set方法)

3.使用NSOperation方式

与GCD类似

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    [[[NSOperationQueue alloc] init] addOperationWithBlock:^{
//下载图片
NSURL *url = [NSURL URLWithString:@"http://e.hiphotos.baidu.com/image/pic/item/e7cd7b899e510fb34395d1c3de33c895d0430cd1.jpg"]; NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *img = [UIImage imageWithData:data]; //回到主线程
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.imgView.image = img;
}]; }]; }
 

最新文章

  1. asp.net读取模版并写入文本文件
  2. TCP和UDP的区别
  3. OSG的节点访问
  4. JDBC连接数据库演示
  5. 安装了ubuntu14.04+windows7双系统的笔记本启动后出现grub rescue&gt;提示符
  6. Java 中类的加载顺序
  7. BZOJ 2229 最小割
  8. SOA_环境安装系列4_Oracle SOA安装和环境搭建(案例)
  9. C#实现ByteBuffer类 .
  10. tyvj4866 摆摊
  11. Postman基本使用——get、post请求、断言、环境变量
  12. Convert Adjacency matrix into edgelist
  13. 课程8:《Maven精品教程视频》--视频目录
  14. 自执行匿名函数: (function() { /* code */ })();
  15. Why Choose MB SD C5 with Engineer Software
  16. 201621123075《Java程序设计》第1周学习总结
  17. hdu 1290_献给杭电五十周年校庆的礼物
  18. 3-log4j2之输出日志到文件
  19. jsp开发环境搭建(windows64位)
  20. JavaScript原型链基础(prototype chain)

热门文章

  1. asp.net解决高并发的方案.
  2. Eclipse快捷键壁纸-0基础必备
  3. Linux C 文件与目录3 文件读写
  4. [转载]EF Code First 学习笔记:约定配置
  5. SqlServer中Sql语句的逻辑执行顺序
  6. 初学MFC
  7. htop
  8. 深入分析windows下配置wamp环境各模块的版本兼容性
  9. 【BZOJ】【1503】 【NOI2004】郁闷的出纳员
  10. Spring Batch学习