一.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)的更多相关文章

  1. VC 线程间通信的三种方式

    1.使用全局变量(窗体不适用)     实现线程间通信的方法有很多,常用的主要是通过全局变量.自定义消息和事件对象等来实现的.其中又以对全局变量的使用最为简洁.该方法将全局变量作为线程监视的对象,并通 ...

  2. 【转】VC 线程间通信的三种方式

    原文网址:http://my.oschina.net/laopiao/blog/94728 1.使用全局变量(窗体不适用)      实现线程间通信的方法有很多,常用的主要是通过全局变量.自定义消息和 ...

  3. 容器间通信的三种方式 - 每天5分钟玩转 Docker 容器技术(35)

    容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信. IP 通信 从上一节的例子可以得出这样一个结论:两个容器要能通信,必须要有属于同一个网络的网卡. 满足这 ...

  4. Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  5. Java线程间通信-回调的实现方式

    Java线程间通信-回调的实现方式   Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互.   比如举一个简单例子,有一个多线程的 ...

  6. 多线程之线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  7. 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  8. [转] 微信小程序页面间通信的5种方式

    微信小程序页面间通的5种方式 PageModel(页面模型)对小程序而言是很重要的一个概念,从app.json中也可以看到,小程序就是由一个个页面组成的. 如上图,这是一个常见结构的小程序:首页是一个 ...

  9. Angular 组件通信的三种方式

    我们可以通过以下三种方式来实现: 传递一个组件的引用给另一个组件 通过子组件发送EventEmitter和父组件通信 通过serive通信 1. 传递一个组件的引用给另一个组件 Demo1 模板引用变 ...

随机推荐

  1. javascript创建自定义对象和prototype

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Android----------eclipse常用快捷键

    类级操作:--------------------一个去包,一个导包------------------------------------ Ctrl+shift+O (不是零) 清除没用引用 ctr ...

  3. android 中使用缓存加载数据

    最近app快完工了,但是很多列表加载,新闻咨询等数据一直从网络请求,速度很慢,影响用户体验,所以寻思用缓存来加载一些更新要求不太高的数据 废话不多说,上代码 欢迎转载,但请保留文章原始出处:)  博客 ...

  4. [Leetcode] Sort Colors (C++)

    题目: Given an array with n objects colored red, white or blue, sort them so that objects of the same ...

  5. setInterval()-----------js 函数总结

    setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭.由 s ...

  6. 函数stripslashes去除转义 shopnc 搜索框过滤特殊字符 输入单斜杆会自动转义

    如何php是如何处理和过滤特殊字符的呢? 搜索%_显示所有商品:搜索\会在搜索框内叠加\\ 查了一下 magic_quotes_sybase 项开启,反斜线将被去除,但是两个反斜线将会被替换成一个. ...

  7. MVC WEB api 自动生成文档

    最近在一直在用webapi做接口给移动端用.但是让我纠结的时候每次新加接口或者改动接口的时候,就需要重新修改文档这让我很是苦恼.无意中发现.webapi居然有自动生成文档的功能....真是看见了救星啊 ...

  8. mongodb GUI

    官网:http://robomongo.org/ 提供Mac .Windows .Linux三种版本: robomongo界面简洁功能强大人性化:

  9. Log4net 可直接使用的配置

    config配置 <xml version="1.0"> <configuration> <configSections> <!--配置一 ...

  10. hdu 1466 计算直线的交点数

    http://acm.hdu.edu.cn/showproblem.php?pid=1466 N条直线的交点方案数 = c 条直线交叉的交点数与(N-c)条平行线 + c 条直线本身的交点方案 = ( ...