`

多线程编程3 - NSOperationQueue

    博客分类:
  • ios
 
阅读更多

转自:http://blog.csdn.net/q199109106q/article/details/8566222

一、简介

一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的。也可以将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步执行的。

创建一个操作队列:

 

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

 二、添加NSOperationNSOperationQueue

 

 

 

1.添加一个operation

 

[queue addOperation:operation];  

 2.添加一组operation

 

 

[queue addOperations:operations waitUntilFinished:NO];  

 3.添加一个block形式的operation

 

 

[queue addOperationWithBlock:^() {  
    NSLog(@"执行一个新的操作,线程:%@", [NSThread currentThread]);  
}]; 

 NSOperation添加到queue之后,通常短时间内就会得到运行。但是如果存在依赖,或者整个queue被暂停等原因,也可能需要等待。

 

 

注意:NSOperation添加到queue之后,绝对不要再修改NSOperation对象的状态。因为NSOperation对象可能会在任何时候运行,因此改变NSOperation对象的依赖或数据会产生不利的影响。你只能查看NSOperation对象的状态, 比如是否正在运行、等待运行、已经完成等

 

三、添加NSOperation的依赖对象
1.当某个NSOperation对象依赖于其它NSOperation对象的完成时,就可以通过addDependency方法添加一个或者多个依赖的对象,只有所有依赖的对象都已经完成操作,当前NSOperation对象才会开始执行操作。另外,通过removeDependency方法来删除依赖对象。

[operation2 addDependency:operation1];  

 依赖关系不局限于相同queue中的NSOperation对象,NSOperation对象会管理自己的依赖, 因此完全可以在不同的queue之间的NSOperation对象创建依赖关系



 
唯一的限制是不能创建环形依赖,比如A依赖B,B依赖A,这是错误的

 

2.依赖关系会影响到NSOperation对象在queue中的执行顺序,看下面的例子:

1> 没有设置依赖关系

NSOperationQueue *queue = [[NSOperationQueue alloc] init];  
  
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^(){  
    NSLog(@"执行第1次操作,线程:%@", [NSThread currentThread]);  
}];  
  
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){  
    NSLog(@"执行第2次操作,线程:%@", [NSThread currentThread]);  
}];  
  
[queue addOperation:operation1];  
[queue addOperation:operation2];  

 打印信息

2013-02-03 00:21:35.024 thread[5616:3d13] 执行第1次操作,线程:<NSThread: 0x7658570>{name = (null), num = 3}  
2013-02-03 00:21:35.063 thread[5616:1303] 执行第2次操作,线程:<NSThread: 0x765a2e0>{name = (null), num = 4}  

 可以看出,默认是按照添加顺序执行的,先执行operation1,再执行operation2

 

 

2> 设置了依赖关系

NSOperationQueue *queue = [[NSOperationQueue alloc] init];  
  
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^(){  
    NSLog(@"执行第1次操作,线程:%@", [NSThread currentThread]);  
}];  
  
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){  
    NSLog(@"执行第2次操作,线程:%@", [NSThread currentThread]);  
}];  
// operation1依赖于operation2  
[operation1 addDependency:operation2];  
  
[queue addOperation:operation1];  
[queue addOperation:operation2];  

 打印信息:

2013-02-03 00:24:16.260 thread[5656:1b03] 执行第2次操作,线程:<NSThread: 0x7634490>{name = (null), num = 3}  
2013-02-03 00:24:16.285 thread[5656:1303] 执行第1次操作,线程:<NSThread: 0x9138b50>{name = (null), num = 4}  

 可以看出,先执行operation2,再执行operation1

 

 

四、修改Operations的执行顺序

对于添加到queue中的operations,它们的执行顺序取决于2点:

1.首先看看NSOperation是否已经准备好:是否准备好由对象的依赖关系确定

2.然后再根据所有NSOperation的相对优先级来确定。优先级等级则是operation对象本身的一个属性。默认所有operation都拥有“普通”优先级,不过可以通过setQueuePriority:方法来提升或降低operation对象的优先级。优先级只能应用于相同queue中的operations。如果应用有多个operation queue,每个queue的优先级等级是互相独立的。因此不同queue中的低优先级操作仍然可能比高优先级操作更早执行。

注意:优先级不能替代依赖关系,优先级只是对已经准备好的 operations确定执行顺序。先满足依赖关系,然后再根据优先级从所有准备好的操作中选择优先级最高的那个执行。

 

五、设置队列的最大并发操作数量

队列的最大并发操作数量,意思是队列中最多同时运行几条线程

虽然NSOperationQueue类设计用于并发执行Operations,你也可以强制单个queue一次只能执行一个Operation。setMaxConcurrentOperationCount:方法可以配置queue的最大并发操作数量。设为1就表示queue每次只能执行一个操作。不过operation执行的顺序仍然依赖于其它因素,比如operation是否准备好和operation的优先级等。因此串行化的operation queue并不等同于GCD中的串行dispatch queue

// 每次只能执行一个操作  
queue.maxConcurrentOperationCount = 1;  
// 或者这样写  
[queue setMaxConcurrentOperationCount:1];  

 

六、取消Operations

 

一旦添加到operation queue,queue就拥有了这个Operation对象并且不能被删除,唯一能做的事情是取消。你可以调用Operation对象的cancel方法取消单个操作,也可以调用operation queue的cancelAllOperations方法取消当前queue中的所有操作。

// 取消单个操作  
[operation cancel];  
  
// 取消queue中所有的操作  
[queue cancelAllOperations];  

 七、等待Options完成

为了最佳的性能,你应该设计你的应用尽可能地异步操作,让应用在Operation正在执行时可以去处理其它事情。如果需要在当前线程中处理operation完成后的结果,可以使用NSOperation的waitUntilFinished方法阻塞当前线程,等待operation完成。通常我们应该避免编写这样的代码,阻塞当前线程可能是一种简便的解决方案,但是它引入了更多的串行代码,限制了整个应用的并发性,同时也降低了用户体验。绝对不要在应用主线程中等待一个Operation,只能在第二或次要线程中等待。阻塞主线程将导致应用无法响应用户事件,应用也将表现为无响应。

// 会阻塞当前线程,等到某个operation执行完毕  
[operation waitUntilFinished];  

 

除了等待单个Operation完成,你也可以同时等待一个queue中的所有操作,使用NSOperationQueue的waitUntilAllOperationsAreFinished方法。注意:在等待一个 queue时,应用的其它线程仍然可以往queue中添加Operation,因此可能会加长线程的等待时间。

// 阻塞当前线程,等待queue的所有操作执行完毕  
[queue waitUntilAllOperationsAreFinished];  

 八、暂停和继续queue

 

如果你想临时暂停Operations的执行,可以使用queue的setSuspended:方法暂停queue。不过暂停一个queue不会导致正在执行的operation在任务中途暂停,只是简单地阻止调度新Operation执行。你可以在响应用户请求时,暂停一个queue来暂停等待中的任务。稍后根据用户的请求,可以再次调用setSuspended:方法继续queue中operation的执行

// 暂停queue  
[queue setSuspended:YES];  
  
// 继续queue  
[queue setSuspended:NO];  

 

  • 大小: 45.2 KB
分享到:
评论

相关推荐

    iOS多线程编程指南(一)关于多线程编程 - 51CTO.COM1

    在iOS开发中,多线程编程是至关重要的技术,它能帮助我们实现应用程序的高效运行,提高用户体验。本文将作为iOS多线程编程指南的第一部分,深入探讨多线程的基本概念、常用技术以及最佳实践。 1. **多线程基础** ...

    iOS多线程编程知多少 - 51CTO.COM1

    在iOS开发中,多线程编程是一个至关重要的概念,它涉及到如何在应用程序中同时执行多个任务,以提高程序性能和用户体验。本文将深入探讨iOS多线程编程的主要知识点。 首先,我们要了解iOS中的多线程模型。主要有三...

    iOS-多线程之NSOperation - iOS知识库1

    总之,NSOperation和NSOperationQueue为iOS开发者提供了一种高效、易用的方式来实现多线程编程,它们提供了取消、依赖关系、自定义行为等功能,使得处理复杂任务变得更加简单。在实际开发中,可以根据需求选择合适的...

    iOS多线程编程指南

    ### iOS多线程编程指南知识点概述 #### 一、多线程编程概念与术语 **1.1 什么是多线程** 多线程是指在单个应用程序中能够同时执行多个任务的技术。它允许应用程序的不同部分并行运行,从而提高整体性能和响应速度...

    多线程编程指南

    在IT行业中,多线程编程是一项至关重要的技术,特别是在iOS开发中。多线程使得应用程序能够同时执行多个任务,提高系统资源的利用率,提升用户体验。本文将深入探讨多线程编程的基本概念、实现方式以及在iOS开发中的...

    Cocoa多线程开发Objective-C详解

    而GCD则是由苹果推出的一种新的多线程编程方法,它通过利用系统的底层技术,使得多线程编程变得更为简单和高效。 GCD(Grand Central Dispatch)是iOS和OS X平台下的并发编程框架,它是一组语言特性、运行时库和...

    多线程GCD,NSThread,NSOperationQueue,详细解释Demo

    GCD是Apple开发的一种多线程技术,它基于C语言,提供了高效且易于使用的并发编程模型。GCD管理一个全局的线程池,开发者无需关心线程的创建和销毁,只需关注任务的提交。GCD的核心概念有队列(Dispatch Queue)和...

    IOS多线程编程的3种实现方法

    iOS中有以下3种多线程编程方法: NSThread Grand Centeral Dispatch(GCD) NSOperation和NSOperationQueue 1.NSThread 这是最轻量级的多线程的方法,使用起来最直观的多线程编程方法。但是因为需要自己管理线程的...

    Objective-C高级编程 iOS与OS X多线程和内存管理_Objective-C_ios_

    《Objective-C高级编程:iOS与OS X多线程和内存管理》是一本深入探讨Apple平台开发中的关键技术的书籍。本书主要围绕Objective-C语言在iOS和OS X操作系统上的应用,特别是针对多线程和内存管理这两个核心主题进行...

    iOS并发编程指南与多线程编程指南合集

    以下是对标题“iOS并发编程指南与多线程编程指南合集”以及描述中提及知识点的详细解读: 1. **并发编程**:并发编程是指在一个时间段内,系统可以执行多个任务,而这些任务可以是同时进行的,也可以是交替进行。在...

    iphone多线程编程

    ### iPhone多线程编程知识点详解 #### 一、引言 在iPhone开发中,多线程编程是一项重要的技术。为了提高应用性能与响应性,合理地利用多线程可以显著提升用户体验。本篇将深入探讨iOS环境下的多线程概念、实现方法...

    iOS开发多线程编程指南

    ### iOS开发多线程编程指南 #### 简介与文档结构 本指南旨在帮助iOS开发者深入了解多线程编程的概念、原理以及最佳实践。多线程编程是提高应用程序响应性和性能的关键技术之一,在iOS开发中尤其重要。通过合理地...

    ios多线程开发的常用四种方式和基本使用

    GCD还提供了同步和异步执行任务的机制,以及屏障、信号量等高级同步工具,使得多线程编程更加灵活和高效。 在实际开发中,选择哪种多线程方案主要取决于需求和场景。对于简单的线程创建,NSThread可能是最快捷的...

    Multithreading(苹果操作系统cocoa多线程编程)

    在现代计算机软件开发中,多线程编程是一项至关重要的技能,特别是在需要处理复杂计算、多任务并行处理或需要改善用户交互体验的应用场景中。苹果公司的操作系统macOS和iOS使用Cocoa框架为开发者提供了一套丰富的...

    iOS多线程编程指南(二)线程管理 - 51CTO.COM1

    在iOS开发中,多线程编程是不可或缺的一部分,它能够帮助开发者实现应用的高效执行,尤其是在处理耗时操作时,如网络请求、大数据计算等。本文将深入探讨iOS中的线程管理,帮助开发者理解如何优雅地处理多线程任务。...

    Objective-C高级编程 iOS与OS X多线程和内存管理

    《Objective-C高级编程:iOS与OS X多线程和内存管理》是一本深入探讨Objective-C在iOS和OS X平台上的核心特性的书籍。本书重点聚焦于多线程和内存管理两个关键领域,对于iOS和macOS应用开发人员来说,这是理解和优化...

    IOS应用源码之多线程编程.zip

    在iOS应用开发中,多线程编程是一项至关重要的技术,它能够让应用程序更加高效地利用处理器资源,提升用户体验。本资源“IOS应用源码之多线程编程.zip”显然是一个专门探讨iOS多线程编程的代码集合,包含了示例源码...

Global site tag (gtag.js) - Google Analytics