iOS多线程之NSOperation详解
使用NSOperation和NSOperationQueue进行多线程开发,只要将一个NSOperation(实际开发中需要使用其子类 NSInvocationOperation,NSBlockOperation)放到NSOperationQueue这个队列中线程就会依次启动。NSOPerationQUeue负责管理,执行所有的NSOPeration。在这个过程中可以更加容易管理线程的总数和控制线程之间的依赖关系。
NSInvocationOperation
首先使用NSInvocationOperation进行一张图片的加载演示,整个过程就是:创建一个操作,在这个操作中指定调用方法和参数,然后加入到操作队列。操作队列管理和执行所有的NSOperation。
- (void)loadImageWithThread{
//创建一个调用操作
NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImage) object:nil];
//创建玩一个NSInvocationOPeration对象并不会调用 它由一个start方法启动操作 但是要注意 调用start方法会在主线程之中调用。一般不会这么操作,而是添加到NSOPerationQueue中。
//创建一个操作队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//注意添加到操作队列中后 队列会启动一个线程执行操作
[queue addOperation:invocationOperation];
}
NSBlockOperation
下面使用NSBlockOperation创建多哥线程加载图片
点击一个按钮开辟多个线程 完成多个图片的加载过程:
#pragma mark - 多线程下载图片
- (void)loadImageWithThread{
int count = ROW_COUNT * COLUMN_COUNT;
//创建操作队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//最大并发线程的数量
queue.maxConcurrentOperationCount = ; for (int i = ; i < count; i ++) {
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
[self loadImage:[NSNumber numberWithInt:i]];
}];
[queue addOperation:operation]; //方法二
[queue addOperationWithBlock:^{
[self loadImage:[NSNumber numberWithInt:i]];
}];
} } #pragma mark -下载图片
- (void)loadImage:(NSNumber *)index{
//请求数据
//currentThread方法可以取得当前操作线程
NSLog(@"current thread:%@",[NSThread currentThread]);
int i = (int)[index integerValue];
NSData *Data = [self requestData:i]; [[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self updateImage:Data andIndex:i];
}];
} - (void)updateImage:(NSData *)imageData andIndex:(int) index{
UIImage *image = [UIImage imageWithData:imageData];
UIImageView *imageView = _imageViews[index]; imageView.image = image;
} - (NSData *)requestData:(int)i{
@autoreleasepool {
if (i != (ROW_COUNT*COLUMN_COUNT-)) {
[NSThread sleepForTimeInterval:2.0];
}
NSURL *url = [NSURL URLWithString:@"http://images.apple.com/iphone-6/overview/images/biggest_right_large.png"];
NSData *data = [NSData dataWithContentsOfURL:url];
return data;
}
}
注意:
1.使用NSBlockOperation方法 所有操作不必单独定义方法,同时可以传递多个参数
2.调用多线程队列的addOperationWithBlock:方法进行UI更新 不用在定义一个实体对象,因为可以传递多个参数
3.使用NSOperation进行多线程开发可以设置最大并发线程。有效的对线程进行了控制
其实使用NSOPeration和NSoperationQueue进行多线程开发最主要的是可以控制最大并发线程数和可以很方便的控制各个线程的执行顺序。上面的例子中已经设置了最大并发线程数。下面我们来看一看控制线程执行的顺序。每个NSoperation都可以添加设置依赖。假设操作A依赖与操作B。线程操作队列就会先执行B在执行A。
#pragma mark - 多线程下载图片
- (void)loadImageWithThread{
int count = ROW_COUNT * COLUMN_COUNT;
//创建操作队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//最大并发线程的数量
queue.maxConcurrentOperationCount = ; NSBlockOperation *lastOperation = [NSBlockOperation blockOperationWithBlock:^{
[self loadImage:[NSNumber numberWithInt:count -]];
}]; for (int i = ; i < count - ; i ++) {
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
[self loadImage:[NSNumber numberWithInt:i]];
}];
[queue addOperation:operation];
//设置新开辟的线程 依赖于最后一个线程,所以最后一张在那个图片会先加载
[operation addDependency:lastOperation]; // //方法二
// [queue addOperationWithBlock:^{
// [self loadImage:[NSNumber numberWithInt:i]];
// }];
}
}
iOS多线程之NSOperation详解的更多相关文章
- iOS多线程之GCD详解
GCD(Grand Central Dispatch)是基于C语言开发的一套多线程开发机制.也是目前苹果官方推荐的多线程开发方法.iOS三种多线程开发中GCD是抽象层次最高的.当然用起来也是最简单的. ...
- iOS多线程之NSThread详解
在iOS中每个进程启动后都会建立一个主线程(UI线程),这个线程是其他线程的父线程.由于iOS中除了主线程,其他子线程是独立于Cocoa Touch的,所以只有主线程可以更新UI界面.iOS多线程的使 ...
- iOS 多线程之NSOperation篇举例详解
这篇博客是接着总篇iOS GCD NSOperation NSThread等多线程各种举例详解写的一个支篇.总篇也包含了此文的链接.本文讲解的知识点有NSBlockOperationClick,队列, ...
- iOS-多线程之NSThread详解
前言 线程是用来执行任务的,线程彻底执行完任务A才能去执行任务B.为了同时执行两个任务,产生了多线程. 我打开一个视频软件,我开辟一个线程A让它执行下载任务,我开辟一个线程B,用来播放视频.我开辟两个 ...
- IOS多线程之NSOperation学习总结
NSOperation简介 1.NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程 2.NSOperation和NSOperationQu ...
- iOS多线程之NSOperation,NSOperationQueue
使用 NSOperation的方式有两种, 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation. 另一种是继承NSOperation 如果你也 ...
- (五十六)iOS多线程之NSOperation
NSOpertation是一套OC的API,是对GCD进行的Cocoa抽象. NSOperation有两种不同类型的队列,主队列和自定义队列. 主队列运行于主线程上,自定义队列在后台运行. [NSBl ...
- iOS多线程之NSOperation和NSOperationQueue的使用
一:NSOperation 两个子类+重写main方法 NSInvocationOperation NSBlockOperation 有个类方法 BlockOprationWith: 还有就是自己个子 ...
- ios多线程之NSOperation
使用 NSOperation的方式有两种, 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation. 另一种是继承NSOperation 如果你也 ...
随机推荐
- Android环境搭建和编写helloworld
一.配置jdk环境(学过java的请无视) 1.安装jdk jdk下载地址:http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk ...
- 访客至上的Web、移动可用性设计--指导原则
文章出自:听云博客 关于可用性设计,之前写过一个“纸上谈兵”版本的,那篇帖子主要是根据A/B test的方式来进行的. 但是最近找了本Steve krug写的Don't make me think,我 ...
- Android 自定义控件(一)
本文用一个简单的例子来说明一下自定义控件的步骤实现,自定义控件有几种实现类型,分别为继承自view完全自定义,继承现有的 控件实现特定效果,继承viewgroup实现布局类等: 本文研究的是继承自vi ...
- GET/POST请求(NSURLSession)
步骤 使用NSURLSession创建task,然后执行task Task a.NSURLSessionTask是一个抽象类,本身不能使用,只能使用它的子类 b.NSURLSessionDataTas ...
- Spark:利用Eclipse构建Spark集成开发环境
前一篇文章“Apache Spark学习:将Spark部署到Hadoop 2.2.0上”介绍了如何使用Maven编译生成可直接运行在Hadoop 2.2.0上的Spark jar包,而本文则在此基础上 ...
- MapReduce实例-NASA博客数据频度简单分析
环境: Hadoop1.x,CentOS6.5,三台虚拟机搭建的模拟分布式环境,gnuplot, 数据:http://ita.ee.lbl.gov/html/contrib/NASA-HTTP.htm ...
- Bigfish的重新安装
昨天把ofbiz安装并成功运行起来,今天接着再把bigfish下载下来. 上次安装配置bigfish时,记得是费了一番周折的,最后也不知道怎么瞎折腾,最终居然跑起来了. 今天有意识整理了下关键步骤,记 ...
- 找出如下数组中最大的元素和最小的元素, a[][]={{3,2,6},{6,8,2,10},{5},{12,3,23}}
int [][]a={{3,2,6},{6,8,2,10},{5},{12,3,23}}; //先对二维数组进行遍历:然后把二维数组合成一个数组 int[] k=new int[11]; int q= ...
- 继续说一下openjson 以及 json path 的使用 (2)
在openjson 里面,其实是可以把数据类型array里面的值遍历出来的,举个栗子 ) = N' {"name":"test", "obj" ...
- 异或的精彩应用 FIX_BTMAP_END
源文件是arch/x86/include/asm/fixmap.henum fixed_addresses {#ifdef CONFIG_X86_32 FIX_HOLE,... _ ...