NSOperation基本使用
NSOperation简单介绍
a. 是OC语言中基于GCD的面向对象的封装 b. 使用起来比GCD更加简单(面向对象) c. 提供了一些用GCD不好实现的功能 d. 苹果推荐使用,使用NSOperation不用关心线程以及线程的生命周期 . NSOperation是一个抽象类 i. 不能直接使用(方法没有实现) ii. 约束子类都具有共同的属性和方法 . NSOperation的子类 i. NSInvocationOperation ii. NSBlockOperation .NSOperationQueue 队列
NSInvocationOperation代码演示
. 执行操作
//创建操作
NSInvocationOperation* op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadFile:) object:@"fileName"];
//在当前线程执行方法(开始执行操作)
[op start];
. 把操作添加到队列(并开始异步执行) //创建操作
NSInvocationOperation* op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadFile:) object:@"fileName"];
//将操作添加到队列,会自动异步调用方法
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:op];
- (void)downloadFile:(id)object { NSLog(@"下载:%@----线程:%@", object, [NSThread currentThread]); }
. 开启多个线程, 不会顺序执行-- -》GCD并发队列, 异步执行
//队列
NSOperationQueue* queue = [[NSOperationQueue alloc] init];
for (int i = ; i < ; i++) {
//创建操作
NSInvocationOperation* op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadFile:) object:@(i)];
//将操作添加到队列,会自动异步调用方法
[queue addOperation:op];
}
- (void)downloadFile:(id)object
{
NSLog(@"下载:%@----线程:%@", object, [NSThread currentThread]);
NSBlockOperation代码演示
//1. NSBlockOperation
//队列
NSOperationQueue* queue = [[NSOperationQueue alloc] init];
for (int i = ; i < ; i++) { //操作
NSBlockOperation* op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"down %d %@", i, [NSThread currentThread]);
}];
[queue addOperation:op];
}
//2. NSOperationQueue添加block的operation代码更简练
NSOperationQueue* queue = [[NSOperationQueue alloc] init];
for (int i = ; i < ; i++) {
[queue addOperationWithBlock:^{
NSLog(@"down %d %@", i, [NSThread currentThread]);
}];
}
//3. 全局操作队列(controller的全局), 调度所有的异步操作 定义属性
@property (nonatomic, strong) NSOperationQueue* queue;
//懒加载队列
- (NSOperationQueue*)queue
{
if (_queue == nil) {
_queue = [[NSOperationQueue alloc] init];
}
return _queue;
}
for (int i = ; i < ; i++) {
[self.queue addOperationWithBlock:^{
NSLog(@"down %d %@", i, [NSThread currentThread]);
}];
}
//4. 监听操作完成
[op1 setCompletionBlock:^{
NSLog(@".....");
}];
线程间通讯
//1. 主队列 添加到主队列的操作,最终都执行在主线程上
[NSOperationQueue mainQueue]
//获取当前操作所在的队列
[NSOperationQueue currentQueue]
[self.queue addOperationWithBlock:^{
NSLog(@"异步执行的 %@", [NSThread currentThread]);
//获取主队列
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"主线程?%@", [NSThread currentThread]);
//当前队列是谁呢? 正在执行操作的队列
[[NSOperationQueue currentQueue] addOperationWithBlock:^{
NSLog(@"当前队列是谁呢 %@", [NSThread currentThread]);
}];
}];
}];
NSOperation中的方便的使用
1. 最大并发数
self.queue.maxConcurrentOperationCount = ;
for (int i = ; i < ; i++) {
[self.queue addOperationWithBlock:^{ //加上此代码后执行的过程?
[NSThread sleepForTimeInterval:];
NSLog(@"%@---%d", [NSThread currentThread], i);
}];
}
• 执行过程
、把操作添加到队列 self.queue addOperationWithBlock
、去线程池去取空闲的线程, 如果没有就创建线程
、把操作交给从线程池中取出的线程执行
、执行完成后, 把线程再放回线程池中
、重复2, , 4知道所有的操作都执行完
2. 队列的暂定/继续 取消
. 暂停 判断队列是否是挂起状态时, 并不会判断队列中是否有操作 我们可以先判断下队列是否为空
if (self.queue.operationCount == )
{
NSLog(@"队列中没有操作");
return;
}
. 继续 - (IBAction)pause
{
if (self.queue.operationCount == ) {
NSLog(@"队列中没有操作");
return;
}
if (self.queue.isSuspended) { //继续
self.queue.suspended = NO;
NSLog(@"继续");
}
else {
//挂起(暂定)
self.queue.suspended = YES; NSLog(@"暂停");
}
//当前队列的操作数
NSLog(@"%lu", self.queue.operationCount);
}
. 取消(清除队列中的操作) - (IBAction)cancel
{
[self.queue cancelAllOperations];
NSLog(@"取消");
NSLog(@"%lu", self.queue.operationCount);
}
. 等待队列中的操作执行完毕
//等待队列中的操作执行完毕,会阻塞
[self.queue waitUntilAllOperationsAreFinished]; NSLog(@"over");
依赖关系
. 模拟软件的部分升级
//依赖关系
//模拟软件的部分升级
//下载压缩包
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载 %@",[NSThread currentThread]); }];
//解压,复制到相应目录
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"解压 %@",[NSThread currentThread]); }];
//通知用户
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"通知用户升级完成 %@",[NSThread currentThread]); }];
//设置操作的依赖关系
[op2 addDependency:op1];
[op3 addDependency:op2];
//添加操作
//waitUntilFinished YES 等待所有的操作执行完成 会阻塞窗体的执行 //waitUntilFinished NO 不等待
[self.queue addOperations:@[op1,op2,op3] waitUntilFinished:NO]; NSLog(@"over"); . 循环依赖 发生循环依赖,程序不会死锁。界面也不会阻塞,操作不会执行 [op2 addDependency:op1];
[op3 addDependency:op2];
[op1 addDependency:op3]; . 依赖关系可以快队列执行
//设置操作的依赖关系 [op2 addDependency:op1]; [op3 addDependency:op2];
[self.queue addOperations:@[op1,op2] waitUntilFinished:NO]; NSLog(@"over");
[[NSOperationQueue mainQueue] addOperation:op3];
NSOperation基本使用的更多相关文章
- iOS多线程之9.自定义NSOperation
本文主要讲如何自定义NSOperation,以及自定义NSOperation的一些注意事项,以下载图片为例. 新建一个类,继承于NSOperation. CustomOperation.h 代码 ...
- iOS多线程之8.NSOPeration的其他用法
本文主要对NSOPeration的一些重点属性和方法做出介绍,以便大家可以更好的使用NSOPeration. 1.添加依赖 - (void)addDependency:(NSOperation * ...
- iOS多线程之7.NSOperation的初识
NSOperation和GCD一样,不用我们管理线程的生命周期,加锁等问题,只要把操作封装进NSOperation中,系统会自动帮我们创建线程,执行操作.而且他是面向对象的,我们看起来更容易理解,使用 ...
- 4.4 多线程进阶篇<下>(NSOperation)
本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人"简书" 本文源码 Demo 详见 Github https://github.c ...
- 认识和使用NSOperation
原文链接:http://www.jianshu.com/p/2de9c776f226 NSOperation是OC中多线程技术的一种,是对GCD的OC包装.它包含队列(NSOperationQueue ...
- 多线程下NSOperation、NSBlockOperation、NSInvocationOperation、NSOperationQueue的使用
本篇文章主要介绍下多线程下NSOperation.NSBlockOperation.NSInvocationOperation.NSOperationQueue的使用,列举几个简单的例子. 默认情况下 ...
- iOS NSOperation 封装 通知实现界面更新
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface MYOperation : NSOpe ...
- iOS NSOperation 异步加载图片 封装NSOperation 代理更新
#import <Foundation/Foundation.h> @class MYOperation; @protocol MYOperationDelecate <NSObje ...
- 3.多线程NSOperation
1.NSOperation的基本操作 使用NSOperation的两个子类,NSInvocationOperation 和 NSBlockOperation 创建操作,然后将操作添加到队列中去执行 / ...
- NSOperation的start与main,并发与非并发。
http://blog.csdn.net/a2331046/article/details/52294006 在ios4以前,只有非并发的情况下,队列会为operation开启一个线程来执行.如果是并 ...
随机推荐
- 51NOD 1400 序列分解
传送门:1400 序列分解序列分解 基准时间限制:1s 空间限制:131072 KBKB131072 KB 1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题1 秒 空间限制:13 ...
- Git删除文件操作
使用Git删除文件需要使用Git rm命令来实现,最后git commit 需要注意的是直接rm命令删除后是不可以的,可以用git status 命令尝试一下,效果如图下(创建了test文件,演示了g ...
- sixsix团队“餐站”应用M2阶段发布报告
一.新功能 客户端 搜索功能 我们在M2中实现了对地点的搜索菜品,可以直接在主页页面中的输入框输入用户喜欢的菜品,系统将返回与对应关键字所对应的选择,更加高效直观的满足客户的口味. 菜品图片加载 我们 ...
- 关于Asp.Net Mvc3.0 使用KindEditor4.0 上传图片与文件
http://blog.csdn.net/fyxq14hao/article/details/7245502 今天我们的Asp.Net Mvc 3的项目中,把KindEditor3.9改为 KindE ...
- MySQL------如何安装mysql-connector-java-5.1.38.zip
下载地址:http://dev.mysql.com/downloads/connector/j/ 安装mysql-connector-java-5.1.38.zip:1.解压文件->把里面的my ...
- -----------------------------------项目中整理的非常有用的PHP函数库(二)-----------------------------------------------------
6.PHP列出目录下的文件名 如果你想列出目录下的所有文件,使用以下代码即可: function listDirFiles($DirPath){ if($dir = opendir($DirPath) ...
- 深入了解A*
一.前言 在这里我将对A*算法的实际应用进行一定的探讨,并且举一个有关A*算法在最短路径搜索的例子.值得注意的是这里并不对A*的基本的概念作介绍,如果你还对A*算法不清楚的话,请看姊妹篇<初识A ...
- 字符串匹配的Boyer-Moore算法 详解 加 C# 实现
上一篇文章,我介绍了KMP算法. 但是,它并不是效率最高的算法,实际采用并不多.各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法. Boyer-Mo ...
- Unity教程之再谈Unity中的优化技术
这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体 这一步主要是为了针对性能瓶颈中的”顶点 ...
- .NET中使用Memcached的相关资源整理
Memcached官方站点:http://www.danga.com/memcached/ Memcached Win32 1.2.6下载:http://code.jellycan.com/memca ...