线程间通信的三种方式(NSThread,GCD,NSOperation)
一.NSThread线程间通信
#import "ViewController.h"
@interface ViewController ()<UIScrollViewDelegate>
@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) UIImageView *imageView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1.创建我们的UIImageView
[self createUIImageView];
//2.去网络上下载图片
NSString *URLString = @"http://e.hiphotos.bdimg.com/album/pic/item/9345d688d43f8794f0ab07ddd01b0ef41ad53ae8.jpg";
[self performSelectorInBackground:@selector(loadImage:) withObject:URLString];
//3.设置最大最小缩放比例
self.scrollView.maximumZoomScale = 2.0;
self.scrollView.minimumZoomScale = 0.5;
}
/**
去子线程下载图片
*/
- (void)loadImage:(NSString *)URLString{
NSLog(@"---loadImage start---");
//1.生成NSURL
NSURL *url = [NSURL URLWithString:URLString];
//2.去网络上下载,网络上传输的都是一堆01010的二进制
NSData *imageData = [NSData dataWithContentsOfURL:url];
//3.将我们的imageData转成我们UIImage
UIImage *image = [UIImage imageWithData:imageData];
/**
waitUntilDone 等我们的updateUI 方法执行完毕之后,再执行后面的
*/
[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:NO];
NSLog(@"---loadImage end---");
}
- (void)updateUI:(UIImage *)image{
//1.将image设置给imageView
self.imageView.image = image;
//2.根据我们的图片大小,来决定我们UIImageView的尺寸
[self.imageView sizeToFit];
//3.设置scrollView的contentSize
self.scrollView.contentSize = image.size;
NSLog(@"update UI end");
}
- (void)createUIImageView{
UIImageView *imageView =[[UIImageView alloc] init];
[self.scrollView addSubview:imageView];
self.imageView = imageView;
}
#pragma mark - scrollViewDelegate
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
return self.imageView;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"%s",__func__);
}
@end
二.GCD线程间通信
#import "ViewController.h"
@interface ViewController ()<UIScrollViewDelegate>
@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) UIImageView *imageView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1.创建我们的UIImageView
[self createUIImageView];
//2.去网络上下载图片
/**
去子线程,并发,全局,串行 方法:异步
两个参数
参数1:队列
参数2:任务
*/
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"loadImage----%@",[NSThread currentThread]);
//0.URLString
NSString *URLString = @"http://e.hiphotos.bdimg.com/album/pic/item/9345d688d43f8794f0ab07ddd01b0ef41ad53ae8.jpg";
//1.生成NSURL
NSURL *url = [NSURL URLWithString:URLString];
//2.去网络上下载,网络上传输的都是一堆01010的二进制
NSData *imageData = [NSData dataWithContentsOfURL:url];
//3.将我们的imageData转成我们UIImage
UIImage *image = [UIImage imageWithData:imageData];
//去主线程更新UI
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"---updateUI---%@",[NSThread currentThread]);
//1.将image设置给imageView
self.imageView.image = image;
//2.根据我们的图片大小,来决定我们UIImageView的尺寸
[self.imageView sizeToFit];
//3.设置scrollView的contentSize
self.scrollView.contentSize = image.size;
});
});
//3.设置最大最小缩放比例
self.scrollView.maximumZoomScale = 2.0;
self.scrollView.minimumZoomScale = 0.5;
}
- (void)createUIImageView{
//1.创建imageView
UIImageView *imageView =[[UIImageView alloc] init];
[self.scrollView addSubview:imageView];
self.imageView = imageView;
}
#pragma mark - scrollViewDelegate
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
return self.imageView;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"%s",__func__);
}
@end
三.NSOperation线程间通信
#import "ViewController.h"
@interface ViewController ()<UIScrollViewDelegate>
@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) UIImageView *imageView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1j.创建我们的UIImageView
[self createUIImageView];
//2.去网络上下载图片
//先去子线程做耗时操作(下载) 然后再去主线程更新UI
//创建并发队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:^{
//子线程
NSLog(@"loadImage----%@",[NSThread currentThread]);
//0.URLString
NSString *URLString = @"http://e.hiphotos.bdimg.com/album/pic/item/9345d688d43f8794f0ab07ddd01b0ef41ad53ae8.jpg";
//1.生成NSURL
NSURL *url = [NSURL URLWithString:URLString];
//2.去网络上下载,网络上传输的都是一堆01010的二进制
NSData *imageData = [NSData dataWithContentsOfURL:url];
//3.将我们的imageData转成我们UIImage
UIImage *image = [UIImage imageWithData:imageData];
//去主线程更新UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//主线程
NSLog(@"---updateUI---%@",[NSThread currentThread]);
//1.将image设置给imageView
self.imageView.image = image;
//2.根据我们的图片大小,来决定我们UIImageView的尺寸
[self.imageView sizeToFit];
//3.设置scrollView的contentSize
self.scrollView.contentSize = image.size;
}];
}];
//3.设置最大最小缩放比例
self.scrollView.maximumZoomScale = 2.0;
self.scrollView.minimumZoomScale = 0.5;
}
- (void)createUIImageView{
UIImageView *imageView =[[UIImageView alloc] init];
[self.scrollView addSubview:imageView];
self.imageView = imageView;
}
#pragma mark - scrollViewDelegate
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
return self.imageView;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"%s",__func__);
}
@end
线程间通信的三种方式(NSThread,GCD,NSOperation)的更多相关文章
- VC 线程间通信的三种方式
1.使用全局变量(窗体不适用) 实现线程间通信的方法有很多,常用的主要是通过全局变量.自定义消息和事件对象等来实现的.其中又以对全局变量的使用最为简洁.该方法将全局变量作为线程监视的对象,并通 ...
- 【转】VC 线程间通信的三种方式
原文网址:http://my.oschina.net/laopiao/blog/94728 1.使用全局变量(窗体不适用) 实现线程间通信的方法有很多,常用的主要是通过全局变量.自定义消息和 ...
- 容器间通信的三种方式 - 每天5分钟玩转 Docker 容器技术(35)
容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信. IP 通信 从上一节的例子可以得出这样一个结论:两个容器要能通信,必须要有属于同一个网络的网卡. 满足这 ...
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- Java线程间通信-回调的实现方式
Java线程间通信-回调的实现方式 Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互. 比如举一个简单例子,有一个多线程的 ...
- 多线程之线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- [转] 微信小程序页面间通信的5种方式
微信小程序页面间通的5种方式 PageModel(页面模型)对小程序而言是很重要的一个概念,从app.json中也可以看到,小程序就是由一个个页面组成的. 如上图,这是一个常见结构的小程序:首页是一个 ...
- Angular 组件通信的三种方式
我们可以通过以下三种方式来实现: 传递一个组件的引用给另一个组件 通过子组件发送EventEmitter和父组件通信 通过serive通信 1. 传递一个组件的引用给另一个组件 Demo1 模板引用变 ...
随机推荐
- HTML 表格入门
每个表格都是由 table 标签开始. 每个表格行由 tr 标签开始. 每个表格数据由 td 标签开始. 这样是一行三列: <table border="1"> < ...
- iOS 面试题 1
1. 简述OC中内存管理机制.与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite ...
- C# List<T>的详细用法
所属命名空间:System.Collections.Generic List<T>类是 ArrayList 类的泛型等效类.该类使用大小可按需动态增加的数组实现 IList<T> ...
- 导入android项目在eclipse中会报@Override错误
很多时候导入android项目在eclipse中会报@Override错误,这是由于java编译器的版本不正确,Java 1.5的编译器默认对父类的方法进行覆盖,采用@Override进行说明:但1. ...
- Ubuntu14.10下解决chromium浏览器无法安装adobe flash的问题
本文参考了一下资源和博客,在此提出表示感谢: http://my.oschina.net/u/209016/blog/290067 http://ubuntuhandbook.org/index.ph ...
- codeforces 340E Iahub and Permutations(错排or容斥)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Iahub and Permutations Iahub is so happy ...
- PHP图片加文字水印和图片水印方法
文字水印 $dst_path = 'dst.jpg'; //创建图片的实例$dst = imagecreatefromstring(file_get_contents($dst_path)); //打 ...
- 给Array添加删除重复元素函数
给Array本地对象增加一个原型方法,它用于删除数组中重复的元素(可能有多个重复), 返回值是一个包含被删除的重复条目的新数组. Array.prototype.distinct = function ...
- 安卓初步:通讯技术介绍&&安卓介绍
通讯技术: 1G 模拟制式 只能进行语音通话. 2G GSM, CDMA 收发短信和邮件. 2.5G GPRS, EDGE 访问wap网络数据.(图片, 壁纸, 文 ...
- php 查看文档
http://www.runoob.com/php/php-datatypes.html php 学习网站 : http://www.phpfans.net/