博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios学习笔记——操作队列NSOperation的基本操作
阅读量:5228 次
发布时间:2019-06-14

本文共 2291 字,大约阅读时间需要 7 分钟。

1、设置操作对象之间的依赖


一个对象依赖于另一个对象,就说明该对象不能执行直到另一个对象执行完毕。

我们使用NSOperation对象的addDependency:方法来给两个对象之间添加依赖关系。此方法为当前对象建立一个单向依赖关系,参数为指定的目标操作对象。这种依赖关系意味着当前的对象不能开始执行,知道目标对象完成操作。这种依赖关系也不限于在同一队列中。但是我们不能在操作对象中建立循环依赖关系。

我们应该总是添加依赖关系在操作对象运行之前或者将它们添加到一个操作队列之前。在之后添加的依赖,可能不会阻止一个给定的对象的运行。

 

1 #import "ViewController.h" 2  3 @interface ViewController () 4  5 @end 6  7 @implementation ViewController 8  9 - (void)viewDidLoad {10     [super viewDidLoad];11     12     NSInvocationOperation * op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(runOperation) object:nil];13     14     NSBlockOperation * op2 = [NSBlockOperation blockOperationWithBlock:^{15         NSThread * thread = [NSThread currentThread];16         NSLog(@"NSBlockOperation1--%@", thread);17     }];18     19     [op2 addExecutionBlock:^{20         NSThread * thread = [NSThread currentThread];21         NSLog(@"NSBlockOperation2--%@", thread);22     }];23     24     [op1 addDependency:op2];25     26     NSOperationQueue * queue = [[NSOperationQueue alloc] init];27     [queue addOperation:op2];28     [queue addOperation:op1];29 }30 31 - (void)runOperation32 {33     NSThread * thread = [NSThread currentThread];34     NSLog(@"InvocationOperation--%@", thread);35 }36 37 38 @end

输出:

 

2、设置操作的优先级


 

设置操作对象的优先级,需要调用setQueuePriority:方法。优先级仅使用同一操作队列中的操作。

优先级级别不是依赖关系的替代品,优先级确定操作队列开始执行的顺序,只执行当前准备的操作。例如,如果队列中包含一个高优先级喝一个低优先级的操作,并且两个操作都准备就绪,队列将首先执行高优先级的操作。如果高优先级操作没有准备就绪,而低优先级的操作已经准备好,那么先执行低优先级操作。

优先级只影响操作执行的顺序,而不控制完成的顺序。而且并不是等待高优先级的队列执行完后再执行优先级低的队列。

优先级的值(默认为NSOperationQueuePriorityNormal):

typedef enum : NSInteger {

  NSOperationQueuePriorityVeryLow = -8,

  NSOperationQueuePriorityLow = -4,

  NSOperationQueuePriorityNormal = 0,

  NSOperationQueuePriorityHigh = 4,

  NSOperationQueuePriorityVeryHigh = 8

} NSOperationQueuePriority;

1 NSInvocationOperation * op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(runOperation) object:nil];2 [op1 setQueuePriority:NSOperationQueuePriorityHigh];

 

3、设置一个完成快


我们可以通过完成块来完成操作完成之后的工作。我们用setCompletionBlock:方法来设置完成块。

1 NSInvocationOperation * op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(runOperation) object:nil];2     3 [op1 setCompletionBlock:^{4     //完成一些操作         5 }];

 

转载于:https://www.cnblogs.com/sjzlovecj/p/5496276.html

你可能感兴趣的文章
安装cocoa pods时出现Operation not permitted - /usr/bin/xcodeproj的问题
查看>>
makefile中使用变量
查看>>
GIT笔记:将项目发布到码云
查看>>
JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
查看>>
JavaScript 鸭子模型
查看>>
SQL Server 如何查询表定义的列和索引信息
查看>>
GCD 之线程死锁
查看>>
NoSQL数据库常见分类
查看>>
一题多解 之 Bat
查看>>
Java 内部类
查看>>
{面试题7: 使用两个队列实现一个栈}
查看>>
【练习】使用事务和锁定语句
查看>>
centos7升级firefox的flash插件
查看>>
Apache Common-IO 使用
查看>>
再谈Vmware NAT的配置和路由流程
查看>>
javaScript数组去重方法汇总
查看>>
评价意见整合
查看>>
二、create-react-app自定义配置
查看>>
Android PullToRefreshExpandableListView的点击事件
查看>>
系统的横向结构(AOP)
查看>>