线程间通信的三种方式(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 模板引用变 ...
随机推荐
- jBPM4.4与SSH2整合
整合jBPM的目的就是能够通过注入的方式得到ProcessEngine实例,因为ProcessEngine是jbpm 的核心. 整合步骤: 1.新建web程,搭建好SSH2环境 2.导入jbpm相关的 ...
- 三维偏序-二维LIS
Another Longest Increasing Subsequence Problem 有两种思路. 思路一: 考虑到如果只有一维,那么可以用f[s]表示长度为s时,最后一个数是多少,把这个想法 ...
- android设置图片变化的四种效果代码
activity代码如下: package com.example.chapter12_graphic_animation; import android.os.Bundle; import andr ...
- poj2778DNA Sequence (AC自动机+矩阵快速幂)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud DNA Sequence Time Limit: 1000MS Memory ...
- Memcache入门知识
Memcache适合做缓存,是一款管理内存的很小的软件,实现对内存数据的管理,一般我们用memcache存储临时数据,因为内存不能储存永久化的数据,内存里面的数据,断电就消失了. memcache可以 ...
- shell脚本练习(短路练习)
#!/bin/bash #By Spinestars#2013-11-11#This is a lvsnap of auto-create Help(){ echo "Usage: ---d ...
- Wireless Network(POJ 2236)
Wireless Network Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 20724 Accepted: 871 ...
- 黑马程序员 1、C语言32个关键字整理分类
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ C语言一共有32个关键字 一.数据类型关键字(共20个) A.基本数据类型(5个)void :声明 ...
- C++----练习--引用头文件
1.创建头文件和源文件 touch /tmp/tools.h touch /tmp/main.cpp 2.各文件的内容如下: tools.h #include<iostream> void ...
- css显示省略号
white-space:nowrap;overflow:hidden;text-overflow:ellipsis; <!-- 就这三句,,,嘿嘿....->