线程间通信的三种方式(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 模板引用变 ...
随机推荐
- C#总结(3)
这次我们来谈谈函数. C#的函数分为静态函数,和普通函数. 先上代码. using System; using System.Collections.Generic; using System.Lin ...
- VS2015预览版中的C#6.0 新功能(一)
VS2015预览版中的C#6.0 新功能(二) VS2015预览版中的C#6.0 新功能(三) VS2015的预览版在11月12日发布了,下面让我们来看看C#都提供了哪些新的功能. 字符串添写(Str ...
- $(document).ready(function(){})和window.onload=function(){}的比较
这两个函数想必每个前端开发者都不会很陌生,但是很了解用法的人估计就比较少了,博主也是最近才开始注意到这两个函数的区别. 首先$(document).ready(function(){})等同于$(). ...
- 最强烈推荐-我的java收藏夹(内有国内最好的java论坛)
原地址: http://bbs.chinaitlab.com/dispbbs.asp?boardid=148&id=34276 国内: www.chinajavaworld.com-论坛人很多 ...
- activiti笔记一:流程图xml文件
一. 流程图有两个基本要素组成:点和线 点:开始节点.结束节点.各种网关.各种事件 线:连接两点之间的sequenceFlow 二. 一般包含三个步骤:部署.启动.完成 三. 启动的时候,可以设置流程 ...
- [ofbiz]解决load-demo花费过长时间的问题
一直以来使用公司配置的hp-cq45笔记本,在初始化ofbiz的时候load-demo需要花费很长一段时间,比如90分钟,或者129分钟. 解决办法:安装官方驱动--intel快速存储驱动 ok,lo ...
- 前端开发者使用JS框架的三个等级
目前前端开发者使用JS框架是种很普遍的现象,因为框架可以加快开发速度,同时避免各类浏览器的兼容性问题.不过同样是用框架开发,不同开发者的境界水平还是有一定差距,本文将这些前端开发者分为三个等级. 第一 ...
- ssh整合web.xml过滤器和监听器的配置 .
延迟加载过滤器 Hibernate 允许对关联对象.属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行.如果 Service 层返回一个启用了延迟 ...
- php 程序员的历程
今天一朋友该找工作了. 问了我好多 我整理了下 希望有些帮助 以下内容纯属个人感觉如果有不恰当的地方请忽略.... 我做的是项目的包工 就是把销售拿下的项目整合后给我们实现功能. --------- ...
- c# Parallel并行运算
string str = ""; DataTable dt=new DataTable(); dt.Columns.Add("name", typeof(Sys ...