首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

iOS多线程之GCD、OperationQueue 对比和实践记录

可以设置队列中每一个操作的 QOS() 队列的整体 QOS 操作相关 Operation作为一个对象,为我们提供了更多的选择: 任务依赖(addDependency),可以队列设置操作的依赖关系...分析过程详见NSOperationQueue队列中操作依赖相关思考 OperationQueue NSOperation NSOperation 是一个"抽象类",不能直接使用。...,按优先级执行;存在依赖时,按依赖关系先后执行(与无依赖关系的其他任务相比,依赖集合的执行顺序不确定) 队列暂停/继续 通过对队列的isSuspended属性赋值,可实现队列中未执行任务的暂停和继续效果...如果操作对象的执行顺序对您很重要,那么您应该在将操作添加到队列之前使用 依赖关系 建立该顺序,或改用 GCD 的 串行队列 实现序列化效果。...不使用锁来保护某些共享资源,而是指定一个 串行队列 (或使用操作对象依赖项)以正确的顺序执行任务。 避免使用 锁。GCD 调度队列 和 操作队列 提供的支持使得在大多数情况下不需要锁定。

1.5K40

iOS多线程之四:NSOperation使用

一、NSOperation NSOperation是苹果公司对GCD的封装,完全面向对象,但是比GCD拥有更强的可控性和代码可读性。所以使用起来更好理解。...五、NSOPerationQueue NSOperationQueue就是执行NSOperation队列,我们可以将一个或多个NSOperation对象放到队列中去执行,而且是异步执行的。...六、添加NSOperation依赖对象 当某个NSOperation对象依赖于其它NSOperation对象的完成时,就可以通过addDependency方法添加一个或者多个依赖对象,只有所有依赖对象都已经完成操作...需要先添加依赖关系,再将操作添加到队列中。另外,通过removeDependency方法来删除依赖对象。 ?...ps: 使用依赖关系需要注意,依赖关系不局限于相同queue中的NSOperation对象,NSOperation对象会管理自己的依赖, 因此完全可以在不同的queue之间的NSOperation对象创建依赖关系

98730
您找到你想要的搜索结果了吗?
是的
没有找到

多线程之NSOperation小结

一、NSOperation 抽象类 NSOperation 是一个"抽象类",不能直接使用。抽象类的用处是定义子类共有的属性和方法。 NSOperation 是基于 GCD 做的面向对象的封装。...NSOperation 的核心概念:将 操作 添加到 队列。...,针对多核处理器的并发技术 在队列中执行的是由 block 构成的任务,这是一个轻量级的数据结构 要停止已经加入 queue 的 block 需要写复杂的代码 需要通过 Barrier 或者同步任务设置任务之间的依赖关系...OC 框架,更加面向对象,是对 GCD 的封装。 iOS 2.0 推出的,苹果推出 GCD 之后,对 NSOperation 的底层全部重写。...可以队列设置操作的依赖关系 可以设置队列中每一个操作的优先级 高级功能: 最大操作并发数(GCD不好做) 继续/暂停/全部取消 队列设置操作的依赖关系 四、代码实践 1 // 2 // ViewController.m

43020

浅析iOS多线程编程之NSOperation

默认情况下,NSOperation并不具备封装操作的能力,NSOperation是一个基类,要想封装操作,必须使用它的子类。...注意:一定要在操作添加到队列之前设置操作之间的依赖,否则操作已经添加到队列中在设置依赖依赖不会生效。 问题:默认情况下,操作队列中的操作的执行顺序真的是无序的?...不同队列的操作之间也可以设置依赖 依赖关系不局限于相同queue中的NSOperation对象,NSOperation对象会管理自己的依赖, 因此不同的操作队列之间的操作也可以设置依赖。...(4.)优先级不能替代依赖,优先级也绝不等于依赖。优先级只是对已经准备好的操作确定其执行顺序。 (5.)操作的执行优先满足依赖关系,然后再满足优先级。...如果你非要使用的话,建议你使用KVO的方式监听队列的operationCount的变化。杜绝直接使用operationCount。

8.1K40

iOS多线程:『NSOperation、NSOperationQueue』详尽总结

为什么要使用 NSOperation、NSOperationQueue? 可添加完成的代码块,在操作完成后执行。 添加操作之间的依赖关系,方便的控制执行顺序。 设定操作执行的优先级。...NSOperationQueue 对于添加到队列中的操作,首先进入准备就绪的状态(就绪状态取决于操作之间的依赖关系),然后进入就绪状态的操作的开始执行顺序(非结束执行顺序)由操作之间相对的优先级决定(优先级是操作对象自身的属性...NSOperation 实现多线程的使用步骤分为三步: 创建操作:先将需要执行的操作封装到一个 NSOperation 对象中。 创建队列:创建 NSOperationQueue 对象。...NSOperation 操作依赖 NSOperation、NSOperationQueue 最吸引人的地方是它能添加操作之间的依赖关系。通过操作依赖,我们可以很方便的控制操作之间的执行先后顺序。...如果要控制操作间的启动顺序,则必须使用依赖关系。 8.

88180

iOS多线程:『NSOperation、NSOperationQueue』详尽总结

为什么要使用 NSOperation、NSOperationQueue? 可添加完成的代码块,在操作完成后执行。 添加操作之间的依赖关系,方便的控制执行顺序。 设定操作执行的优先级。...NSOperationQueue 对于添加到队列中的操作,首先进入准备就绪的状态(就绪状态取决于操作之间的依赖关系),然后进入就绪状态的操作的开始执行顺序(非结束执行顺序)由操作之间相对的优先级决定(优先级是操作对象自身的属性...NSOperation 实现多线程的使用步骤分为三步: 创建操作:先将需要执行的操作封装到一个 NSOperation 对象中。 创建队列:创建 NSOperationQueue 对象。...NSOperation 操作依赖 NSOperation、NSOperationQueue 最吸引人的地方是它能添加操作之间的依赖关系。通过操作依赖,我们可以很方便的控制操作之间的执行先后顺序。...如果要控制操作间的启动顺序,则必须使用依赖关系

1.2K60

多线程-NSOperation和NSOperationQueue

NSOperation NSOperation类是用来封装在单个任务相关的代码和数据的抽象类。NSOperation 是苹果公司对 GCD 的封装,完全面向对象,所以使用起来更好理解。...操作步骤也很好理解: 将要执行的任务封装到一个 NSOperation 对象中。 将此任务添加到一个 NSOperationQueue 对象中。 然后系统就会自动在执行任务。...创建队列 我们可以调用一个 NSOperation 对象的 start() 方法来启动这个任务,这个默认是 同步执行 的。...NSOperation 之间添加依赖 NSOperation 有一个非常实用的功能,那就是对任务添加依赖。...B.可以使用 removeDependency 来解除依赖关系。 C.可以在不同的队列之间依赖依赖是添加到任务身上的,和队列关系

1.1K30

iOS - 多线程(四):NSOperation

:  ① 最大并发数  ② 队列的暂停/继续/取消操作  ③ 指定操作之间的依赖关系(GCD 中可以使用同步实现) 1.3 NSOperation 与 NSOperationQueue NSOperation...NSOperation使用步骤 NSOperation 和 NSOperationQueue 实现多线程的步骤: ① 创建操作:先将需要执行的操作封装到一个 NSOperation 对象中; ②...创建队列:创建一个 NSOperationQueue 对象; ③ 添加操作到队列中:然后将 NSOperation 对象添加到 NSOperationQueue 队列中。...如果不想使用 NSOperationQueue,可以通过调用 NSOperation 对象的start方法来自己执行操作。...01.721032+0800 多线程[29650:6560162] 执行任务B,{number = 8, name = (null)} */ 可以在不同队列的操作之间添加依赖关系

1.4K10

iOS多线程NSThread,NSOperation和GCD详解

代码如下: 以下代码为调用方式: 运行效果如下: NSOperation依赖NSOperation对象需要依赖于其它NSOperation对象完成时再操作,就可以通过addDependency...方法添加一个或者多个依赖对象,只有所有依赖对象都已经完成操作后,最开始的NSOperation对象才会开始执行,通过removeDependency来删除依赖对象。...使用NSOperation进行多线程开发还可以设置最大并发线程,有效的对线程进行控制。...NSOperation进行多线程开发可以控制线程总数及线程依赖关系....NSOperation是对GCD面向对象的ObjC封装,但是相比GCD基于C语言开发,效率却更高,建议如果任务之间有依赖关系或者想要监听任务完成状态的情况下优先选择NSOperation否则使用GCD.

69620

iOS--多线程之NSOperation

NSOperation 一、NSOperation简单介绍 1、NSOperation简介 ①.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程...NSOperation和NSOperationQueue实现多线程的具体步骤: (1)先将需要执行的操作封装到一个NSOperation对象中 (2)然后将NSOperation对象添加到NSOperationQueue...NSOperation是个抽象类,并不具备封装操作的能力,必须使⽤它的子类 使用NSOperation⼦类的方式有3种: (1)NSInvocationOperation (2)NSBlockOperation...]; // 操作B依赖于操作A (2)可以在不同queue的NSOperation之间创建依赖关系 不能循环依赖(不能A依赖于B,B又依赖于A)。...提示:任务添加的顺序并不能够决定执行顺序,执行的顺序取决于依赖使用Operation的目的就是为了让开发人员不再关心线程。

925140

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

3、使用NSInvocationOperation调用方法 根据选择器创建一个对象 - (instancetype)initWithTarget:(id)target selector:(SEL)sel...二、操作之间的依赖关系 依赖关系和优先级的作用很像,却也不同。如果一个操作A依赖于另一个操作B,那么只有当B操作完成后,A操作才会执行。...操作添加依赖的 添加一个依赖: - (void)addDependency:(NSOperation *)op; 删除一个依赖 - (void)removeDependency:(NSOperation... *)op; 原则上说,一个操作对象依赖可以添加多个,并且当所有依赖都执行完成后才会执行这个操作。...; 获取主线程中的操作队列 + (NSOperationQueue *)mainQueue; 四、队列中操作的执行顺序法则 1、决定于依赖关系,只有当这个操作的依赖全部执行完成后,它才会被执行。

29520

iOS多线程——你要知道的NSOperation都在这里你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里

和NSOperationQueue这一面向对象的多线程类,这两个类与GCD提供的功能类似,NSOperation提供任务的封装,NSOperationQueue顾名思义,提供执行队列,可以自动实现多核并行计算...使用NSOperation和NSOperationQueue来编写多线程程序非常简单,只需要创建一个任务对象,创建一个执行队列或者和获取主线程一样获取一个主任务队列,然后将任务提交给队列即可实现并发,如过你想要串行只需要将队列的并发数设置为一即可.../* 添加一个NSOperation为当前任务的依赖 如果一个任务有依赖,需要等待依赖的任务执行完成才能开始执行 */ - (void)addDependency:(NSOperation *)op;...[queue addOperation:operation4]; [queue addOperation:invocationOperation]; } 上述栗子添加了五个任务,任务依赖关系如下图所示...任务依赖关系图 如图所示,任务2依赖任务1,任务3依赖任务1,任务4依赖任务3,而任务5是独立的,所以任务2需要等待任务1完成后才可以开始执行,任务3也是同样,而任务4需要等待任务3完成后才可以开始执行

1.5K51

阿里、字节:一套高效的iOS面试题( 多线程 GCD底层原理篇)

分别对比 Pthreads : 系统 c 语言多线程框架,不推荐。 NSThread : ## 面向对象,需手动管理生命周期。...NSOperation & NSOperationQueue : GCD 的封装,面向对象 2、GCD有哪些队列,默认提供哪些队列队列 > `dispatch_get_main_queue()` 全局并发队列...NSOperation依赖规则不会区分依赖操作是否真正完成(被取消也被认为完成)。不过,开发者可以决定当依赖操作被取消或未真正完成时是否继续完成这个 NSOperation。...取消一个正在等待依赖项完成的 NSOperation,这些依赖项将被忽略而直接将此属性的值更新为 YES,以表示可正常运行。此时,操作队列将更快将其移除。...如果需要控制并发数、取消任务、添加依赖关系等,那就使用 NSOperation Queue 好了。只不过很多时候都需要子类化 NSOperation。。。

4.2K50

block与GCD--43:NSOperation 与NSOperationQueue

实际上 NSOperation、NSOperationQueue 是基于 GCD 更高一层的封装,完全面向对象。但是比 GCD 更简单易用、代码可读性也更高。...log.png 自定义队列(系统会自动异步执行NSOperation中的操作) 使用 NSOperation 子类创建操作,并使用 addOperation: 将操作加入到操作队列后能够开启新线程,进行并发执行...,比如 [op3 addDependency:op1]; [op1 addDependency:op3]; //错误的写法---相互依赖 设置队列依赖.png 监控NSOperation对象的属性...isExecuting 代表任务正在执行中 isFinished 代表任务已经执行完成,被取消也算执行完成 注:该状态关系依赖其的操作任务,只有在其isFinished状态为YES的时候,依赖其的操作任务才能开始执行...isReady 代表任务是否已经准备执行 注:当其依赖的操作任务都执行完时,改状态才会是YES NSOperation队列里的优先级 iOS8以前,NSOperation通过设置queuePriority

10910

NSOperation

于是,Modern Objective-C开发者有两个选择:GCD和NSOperation. 由于GCD已经发展的比较主流了,我们稍后再说它,先说说面向对象NSOperation....如果你不想子类化NSOperation,可以选择使用NSBlockOperation这个NSOperation的子类,它可以把一个block包装成为一个NSOperation....可以通过调用-start方法来启动一个NSOperation,或者把它放到NSOperationQueue里,当到达队列最前端时也会被自动的执行。...现在来看看NSOperation的几个不同的特性,以及如何如果使用和子类化它: 状态 State NSOperation构建了一个非常优雅的状态机来描述一个operation的执行过程: isReady...要记住添加到queue里的所有的operation的依赖关系,并避免循环依赖,比如A依赖B,B依赖A,这样会产生死锁。

33120

iOS基础问答面试题连载(三)-附答案

9.请简单介绍GCD中的几种队列?(4种) 10.如果当前有多个任务,这些任务都需要开子线程执行,而多个任务之间有一定的依赖关系,如果使用GCD来实现请试着给出一些解决方案。...12.请简单介绍操作队列? 13.如果有多个操作如何来设置依赖关系,如何监听到某个操作执行完毕事件?...全局队列队列 10.如果当前有多个任务,这些任务都需要开子线程执行,而多个任务之间有一定的依赖关系,如果使用GCD来实现请试着给出一些解决方案。...操作依赖补充:使用操作队列可以方便的指定多个操作间的依赖关系,甚至可以实现队列的操作依赖,但是在使用的时候需要注意操作之间不能有循环依赖关系 操作监听:可以使用^completionBlock来实现操作监听...NSOperation可以方便的指定操作间的依赖关系

78850

推荐:多线程的实现方式及经典示例

,它是 GCD 的面向对象的封装,使用起来也更方便, NSOperation实现多线程 NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类 NSInvocationOperation...NSBlockOperation 自定义子类继承NSOperation,实现内部相应的方法 使用 NSOperation 实现多线程的步骤: 创建任务 NSOperation 对象 创建 NSOperationQueue...NSOperationQueue创建队列:主队列和全局队列 // 创建一个其他队列(包括串行队列和并发队列) 放到这个队列中的NSOperation对象会自动放到子线程中执行 NSOperationQueue...,但可以队列依赖,不管NSOperation对象在哪个队列。...只要是两个NSOperation对象就可以依赖 线程间通信 示例:下载图片 // 下载图片 operation实现线程间通信 [[[NSOperationQueue alloc] init] addOperation

1.1K160

浅谈如何在项目中处理页面中的多个网络请求

通过 [[NSOperationQueue alloc] init]; 创建的队列都是并行队列,并且可以将一个或多个 NSOperation 对象放到队列中去执行,而且是异步执行的,一个 NSOperation...当然也可以利用 NSOperationQueue 的线程依赖,当某个 NSOperation 对象依赖于其它 NSOperation 对象的完成时,就可以通过 addDependency 方法添加一个或者多个依赖对象...,只有所有依赖对象都已经完成操作,当前 NSOperation 对象才会开始执行操作。...需要先添加依赖关系,再将操作添加到队列中。另外,通过 removeDependency 方法来删除依赖对象。...如果在某个操作依赖于其他几个任务的完成,可以考虑使用 NSOperationQueue 的线程之间依赖

3.4K31
领券