一.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. php 二维码生成类

    <?php /** * BarcodeQR - Code QR Barcode Image Generator (PNG) * @package BarcodeQR * @category Ba ...

  2. Android——ExpandableListView事件拦截

    1.满足条件 如果使用ExpandableListView,需要子item响应一个事件,比如重新启动一个新的activity,需要满足下面的条件: (1).修改Adapter返回值 覆写BaseExp ...

  3. Android5.0新特性:RecyclerView实现上拉加载更多

    RecyclerView是Android5.0以后推出的新控件,相比于ListView可定制性更大,大有取代ListView之势.下面这篇博客主要来实现RecyclerView的上拉加载更多功能. 基 ...

  4. ScrollView 的使用(非原创)

    1.ScrollView滚动视图是指当拥有很多内容,屏幕显示不完时,需要通过滚动跳转来显示的视图.ScrollView只支持垂直滚动 <ScrollView xmlns:android=&quo ...

  5. SSH连接LINUX乱码解决方法

    1.vi /etc/sysconfig/i18n 将内容改为 LANG="zh_CN.GB18030" LANGUAGE="zh_CN.GB18030:zh_CN.GB2 ...

  6. 调用[[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPad判断设备

    将模拟器改为Ipad时,调用[[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPad判断设备是否为Ipad,但程序并 ...

  7. Webfrom 生成流水号 组合查询 Repeater中单选与复选控件的使用 JS实战应用

                                             Default.aspx 网页界面 <%@ Page Language="C#" AutoE ...

  8. [Leetcode] Search In Rotated Sorted Array (C++)

    题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7  ...

  9. oracle 查询重复数据

    SELECT * FROM td_attrval_group WHERE parent_attrval_id IN(SELECT parent_attrval_id FROM td_attrval_g ...

  10. 精简jQuery Tabs

    闲来无事,周末用jQuery写了一个比较精简的Tabs,个别地方可以用到. 截图及代码如下: <!DOCTYPE html> <html> <head lang=&quo ...