线程间通信的三种方式(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 模板引用变 ...
随机推荐
- php的一些特殊用法
php ruturn的另一个用法 database.php <?php return array ( 'hostname' => 'localhost', 'database' => ...
- FULL JOIN 与 CROSS JOIN
FULL JOIN 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行.(返回JOIN 两端表的所有数据,无论其与另一张表有没有匹配.显示左连接.右连接和内连接的并集) FULL JOIN ...
- Webform服务器控件调用JS
服务器控件调用JS一.两类JS的触发设计1.提 交之前的JS -- 加js的事件C#处理程序2.提交之后的JS -- 用C#代码向页面上写<script>..</script> ...
- (原)error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5577534.html 在debug下使用intel的mkl库时(release下无此问题),莫名的出现 ...
- 评论PK投票功能的手机版
ajax投票.点赞.回复,投票后自动转到查看投票结果,投票结果进度条动画显示 地址:http://files.cnblogs.com/files/macliu/hyw_wap.rar 效果图: 首页:
- 移动web前端的一些硬技能(二)动手前必须掌握的基本常识
记得刚开始接触移动端web的时候,书和网上的资料都不多,查起来很费劲,现在比以前要好很多了,可是还是会有一些刚接触移动端的朋友会问我一些我最初会遇到的问题,或许是书本写的并不那么重,也或许是这些知识写 ...
- requirejs学习之-- 初始化(一)
为了规范在项目中使用的javascript代码,我们使用了requirejs框架. 初始阶段,我们在按钮的点击事件中调用创建的模块,代码如下: function button_click() { _t ...
- 学习http的一个网站
http://www.blogjava.net/zjusuyong/articles/304788.html
- linux多线程编程之互斥锁
多线程并行运行,共享同一种互斥资源时,需要上互斥锁来运行,主要是用到pthread_mutex_lock函数和pthread_mutex_unlock函数对线程进行上锁和解锁 下面是一个例子: #in ...
- 七、适配器(Adapter)模式--结构模式(Structural Pattern)
适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作. 类的 Adapter模式的结构: 类适配器类图: 由图中可以看出,Adaptee ...