iOS多线程编程之二——NSOperation与NSOperationQueue(二)

简介: iOS多线程编程之二——NSOperation与NSOperationQueue

二、操作之间的依赖关系


依赖关系和优先级的作用很像,却也不同。如果一个操作A依赖于另一个操作B,那么只有当B操作完成后,A操作才会执行。操作添加依赖的


添加一个依赖:


- (void)addDependency:(NSOperation *)op;


删除一个依赖


- (void)removeDependency:(NSOperation *)op;

原则上说,一个操作对象的依赖可以添加多个,并且当所有依赖都执行完成后才会执行这个操作。



三、NSOperationQueue操作队列


NSOperationQueue是操作队列类,通过上面的介绍,我们已经可以理解操作,并且操作默认的执行方式是串行的,尽管NSBlockOperation中的block块间是并行执行的,但其和外部操作依然是串行的。如果将操作放入操作队列中,则默认为并行执行的。


示例如下:


- (void)viewDidLoad {

   [super viewDidLoad];

   // Do any additional setup after loading the view, typically from a nib.

   NSOperationQueue * queue = [[NSOperationQueue alloc]init];

   NSInvocationOperation * op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(log) object:nil];

   [queue addOperation:op1];

   for (int i=0; i<10; i++) {

       NSLog(@"%@=%d",[NSThread currentThread],i);

   }

}


-(void)log{

   for (int i=0; i<10; i++) {

       NSLog(@"%@=%d",[NSThread currentThread],i);

   }

}

打印信息如下:




可以看出来,队列的操作是在一个新的线程中执行的,并且操作队列之中的操作也都是异步执行的。



在操作队列中添加一个操作任务:


- (void)addOperation:(NSOperation *)op;


在队列中插入一组操作任务,后面的参数设置是否队列中得任务都执行完成后再执行这一组操作:


- (void)addOperations:(NSArray *)ops waitUntilFinished:(BOOL)wait;


在队列中添加一个block操作


- (void)addOperationWithBlock:(void (^)(void))block;


获取操作队列中的所有操作的数组


@property (readonly, copy) NSArray *operations;


获取操作队列中操作的个数


@property (readonly) NSUInteger operationCount;


设置队列最大并行操作数量


@property NSInteger maxConcurrentOperationCount;


设置是否暂停队列任务执行


@property (getter=isSuspended) BOOL suspended;


设置队列名字


@property (copy) NSString *name;


设置队列的优先级别(iOS8后支持)


@property NSQualityOfService qualityOfService;


取消队列中所有操作任务


- (void)cancelAllOperations;


阻塞当前线程,直到队列中所有任务完成


- (void)waitUntilAllOperationsAreFinished;


获取当前执行的队列


+ (NSOperationQueue *)currentQueue;


获取主线程中的操作队列


+ (NSOperationQueue *)mainQueue;


四、队列中操作的执行顺序法则


1、决定于依赖关系,只有当这个操作的依赖全部执行完成后,它才会被执行。


2、影响于优先级,优先级高的会先执行。

目录
相关文章
|
2月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
165 6
|
5月前
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
309 83
|
2月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
290 0
|
3月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
267 16
|
7月前
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
280 0
|
10月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
201 26
|
10月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
207 17
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
|
12月前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
700 2
|
缓存 Java 开发者
Java多线程编程的陷阱与最佳实践####
本文深入探讨了Java多线程编程中常见的陷阱,如竞态条件、死锁和内存一致性错误,并提供了实用的避免策略。通过分析典型错误案例,本文旨在帮助开发者更好地理解和掌握多线程环境下的编程技巧,从而提升并发程序的稳定性和性能。 ####

热门文章

最新文章