NSOperation和NSOperationQueue
2016-04-27 11:09
507 查看
NSOperation使用需要继承它,用子类重写main方法,也可以使用它已有的两个子类:
设置依赖关系(1,2 都先执行完再执行3)
设置优先级<<先满足依赖关系>>
启动线程
取消Operations
暂停和继续queue
a6f0
//target添加 NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(calculate) object:self]; ...operation2 ...operation3 //block实现 NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ [self calculate]; }];
设置依赖关系(1,2 都先执行完再执行3)
[operation3 addDependency:operation1]; [operation3 addDependency:operation2];
设置优先级<<先满足依赖关系>>
operation1.queuePriority = NSOperationQueuePriorityHigh; operation2.queuePriority = NSOperationQueuePriorityNormal; 优先级不能替代依赖关系,优先级只是对已经准备好的 operations确定执行顺序。 <<先满足依赖关系>>,然后再根据优先级从所有准备好的操作中选择优先级最高的那个执行。
启动线程
//手动启动 start 默认是同步的;先启动则先执行(1,2 达不到并行) [operation1 start]; [operation2 start]; [operation3 start]; //放在队列中自动启动 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:operation1]; [queue addOperation:operation2]; [queue addOperation:operation3]; //设置并发数 queue.maxConcurrentOperationCount = 1; (没有设置依赖关系和优先级的时候,并且最大并发数为1,会根据添加的顺序去执行 这个只是自己试验多次结果都一样,不知道是否一定准确) 设置并发数为1后,会根据优先级执行 可能先执行了优先级高的,然后优先级低的在执行,只是在执行任务的时 (此处的任务都是打印),打印的时候优先级低的先打印了。 但是执行的时候还是先执行优先级高的,如果并发数不是1,然后并发执行 (所以可以通过设置最大并发数为1,来查看先执行的哪个);
取消Operations
一旦添加到队列,queue就拥有了这个Operation对象并且不能被删除 唯一能做的事情是取消 // 取消单个操作 [operation1 cancel]; // 取消queue中所有的操作 [queue cancelAllOperations];
暂停和继续queue
// 暂停queue [queue setSuspended:YES]; // 继续queue [queue setSuspended:NO]; 如果你想临时暂停Operations的执行,可以使用上面方法; 不过暂停一个queue不会导致正在执行的operation在任务中途暂停, 只是简单地阻止调度新Operation执行。 你可以在响应用户请求时,暂停一个queue来暂停等待中的任务。 稍后根据用户的请求,可以再次条用,继续queue中operation的执行
a6f0
相关文章推荐
- EF的SqlQuery和EntitySql
- iOS UILabel显示HTML文本
- Incredibuild 中出现Command line error D8037的解决方法
- !!!求教,java进行数据库查询,re.next()为true,但不执行if(re.next())分支
- Android view中的requestLayout和invalidate方法
- POJ2533 Longest Ordered Subsequence
- exception finished with non zero exit value 2
- 5_6 团体队列(UVa540)<queue与STL其他容器的综合运用>
- easyui和highcharts 动态加载数据和X轴数据
- LeetCode *** 307. Range Sum Query - Mutable (Binary Indexed Trees)
- 华工校赛 F. Bracket Sequence
- hdu1159Common Subsequence(动态规划之最长公共子序列)
- UI组件
- setAccessible(true)
- ThreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别
- APUE阅读笔记(九)——进程关系
- 实现Easyui 可编辑表格
- 线程----BlockingQueue (转)
- Missing Value Treatment
- CarPlay wired连接与wireless连接相互切换