使用NSOperation以及NSOperationQueue - 游贤明

简介: <p style="margin-top:0px; margin-bottom:0.75em; font-size:16px; line-height:1.7em; text-indent:1em; color:rgb(51,51,51); font-family:'Helvetica Neue',Helvetica,Tahoma,Arial,STXihei,'Microsoft YaHe

使用 NSOperation 以及 NSOperationQueue

NSOperation vs. Grand Central Dispatch (GCD)

在Mac OS X v10.6和iOS4之前,NSOperation 与 NSOperationQueue 不同于GCD,他们使用了完全不同的机制。

从Mac OS X v10.6和iOS4开始,NSOperation 和 NSOperationQueue是建立在GCD上的。作为一种通例,苹果推荐使用最高级别的抽象,然而当评估显示有需要时,会突然降到更低级别。

以下是对两者的快速比较,它会帮助你决定何时何地去使用GCD或者NSOperation和NSOperationQueue;

  • GCD是一种轻量级的方法来代表将要被并发执行的任务单位。你并不需要去计划这些任务单位;系统会为你做计划。在块(block)中添加依赖会是一件令人头疼的事情。取消或者暂停一个块会给一个开发者产生额外的工作!:]
  • NSOperation和NSOperationQueue 对比GCD会带来一点额外的系统开销,但是你可以在多个操作(operation)中添加附属。你可以重用操作,取消或者暂停他们。NSOperation和   Key-Value Observation (KVO) 是兼容的;例如,你可以通过监听NSNotificationCenter去让一个操作开始执行。 

NSOperation API 

NSOperation 类有一个相当简短的声明。要定制一个操作,可以遵循以下步骤:

  1. 继承NSOperation类
  2. 重写“main”方法
  3. 在“main”方法中创建一个“autoreleasepool”
  4. 将你的代码放在“autoreleasepool”中(ARC中也需要放在autoreleasepool中,这是为了兼容MRC代码)

为了你能够测试代码,请新建一个类,继承自NSOperation,写成如下的形式:

之后再进行操作:

注意,只有将一个任务添加进了队列当中,这个任务才会被执行.

以下代码是并发执行2个任务,队列的最大并发数是4:

任务具有的优先级:

当你添加了操作到一个队列时,在对操作调用“start”方法之前,NSOperationQueue会浏览所有的操作。那些有较高优先级的操作会被先执行。有同等优先级的操作会按照添加到队列中的顺序去执行(先进先出)。 
(历史注释:在1997年,火星车中的嵌入式系统遭遇过优先级反转问题,也许这是说明正确处理优先级和互斥锁的最昂贵示例了。想对这一事件的背景知识有更多的了解,可以看这个网址:   http://research.microsoft.com/en-us/um/people/mbj/Mars_Pathfinder/Mars_Pathfinder.html  ) 

请添加如下的延迟方法:

先开始任务,1s钟之后cancel掉一个任务:

每个任务结束后都会有一个回调可以表示任务结束:

任务之间的从属关系:

以下来点总结:

  • 要经常检查isCancelled属性。 如果操作不需要被执行了,你就不想在后台去运行它了!(你从外面设置了cancell后,你是需要在方法里面来实现cancell的哦,注意,亲) 
  • 你并不需要重写“start”方法。然而,如果你决定去重写“start”方法,就必须处理好像isExecuting, isFinished, isConcurrent 和 isReady这些属性。否则你的操作类不会正确的运作。
  • 你一旦添加了一个操作到一个队列(NSOperationQueue的一个实例)中,就要负责释放它(如果你不使用ARC的话)。NSOperationQueue 获得操作对象的所有权,调用“start”方法,然后结束时负责释放它。
  • 你不能重用一个操作对象。一旦它被添加到一个队列中,你就丧失了对它的所有权。 如果你想再使用同一个操作类,就必须创建一个新的实例变量。
  • 一个结束的操作不能被重启。
  • 如果你取消了一个操作,它不会马上就发生。它会在未来的某个时候某人在“main”函数中明确地检查isCancelled == YES 时被取消掉;否则,操作会一直执行到完成为止。(见上图)
  • 一个操作是否成功地完成,失败了,或者是被取消了,isFinished的值总会被设置为YES。所以千万不要觉得isFinished == YES就表示所有的事情都顺利完成了 — 特别的,如果你在代码里面有从属性(dependencies),就要更加注意!

NSOperationQueue API

查看当前并发操作的所有任务:

挂起与恢复操作:

This method suspends or resumes the execution of operations. Suspending a queue prevents that queue from starting additional operations. In other words, operations that are in the queue (or added to the queue later) and are not yet executing are prevented from starting until the queue is resumed. Suspending a queue does not stop operations that are already running.

这个方法会挂起或者恢复一个执行的任务.挂起一个队列可以阻止该队列中没有开始的任务.换句话说,在任务队列中还没有开始执行的任务是会被挂起的,直到这个挂起操作被恢复. 挂起一个队列不会让一个已经执行的任务停止哦,亲.

取消所有操作:

要取消一个队列中的所有操作,你只要简单的调用“cancelAllOperations”方法即可。还记得之前提醒过经常检查NSOperation中的isCancelled属性吗? 
原因是“cancelAllOperations”并没有做太多的工作,他只是对队列中的每一个操作调用“cancel”方法 — 这并没有起很大作用!:] 如果一个操作并没有开始,然后你对它调用“cancel”方法,操作会被取消,并从队列中移除。然而,如果一个操作已经在执行了,这就要由单独的操作去识 别撤销(通过检查isCancelled属性)然后停止它所做的工作。

简单的block形式的队列任务:

以上就基本上讲完了怎么使用NSOperation以及NSOperationQueue了,亲.

目录
相关文章
|
8月前
|
C++ 容器
[C++/PTA] 办事大厅排队
[C++/PTA] 办事大厅排队
81 0
|
前端开发 安全 API
 GameFi链游系统开发(BSC链源码)丨币安农场链游系统开发   
区块链技术为游戏行业带来了新的机遇和挑战
|
人工智能 前端开发 大数据
BSC链盲盒游戏系统开发(开发详细)丨BSC链盲盒游戏源码开发
New retail refers to a new retail model in which individuals and enterprises,relying on the Internet,upgrade and transform the production,circulation and sales process of goods by using advanced technical means such as big data,artificial intelligence and psychological knowledge,thereby reshaping th
|
新零售 人工智能 算法
币安链BSC盲盒游戏开发正式版丨币安链BSC盲盒游戏系统开发(逻辑及方案)丨币安链BSC盲盒游戏源码及案例
  新零售,即个人、企业以互联网为依托,通过运用大数据、人工智能等先进技术手段,对商品的生产、流通与销售过程进行升级改造,进而重塑业态结构与生态圈,并对线上服务、线下体验以及现代物流进行深度融合的零售新模式。
|
存储 人机交互 API
8个SwiftUI的小技巧让隔壁同事两眼放光,直呼太卷了
在日常的SwiftUI开发过程中,常常会出现一些“小BUG”让我们措手不及、头顶发凉。这些问题可能是由于我们自己不熟悉SwiftUI语法导致的,也有是SwiftUI本身自带的缺陷,毕竟是一个新兴语言。 那么本章就介绍一些SwiftUI开发的小技巧,帮助我们避避那些让我们头秃的坑。
1222 0
8个SwiftUI的小技巧让隔壁同事两眼放光,直呼太卷了
链游开发成本(币安英雄+飞船系统开发)
眼看链游的项目风起云涌,已经逐渐从链游1.0迈向2.0。链游开发,无疑是2021人们资本市场经常说的关键字。还在有人问,链游开发贵吗?链游2.0逐渐增强游戏的可玩性、持久性,开发出更趋于完美的经济模式。如何避免“元宇宙链游”的内在垄断?这个世界里有一种基因可以避免被少数势力垄断。Roblox的共同创始人NeilRimer建议说:Metaverse的能源将来自用户,而非企业。没有哪个企业可以单独建立一个“元宇宙链游”,而是依赖各方面的力量聚集在一起。
链游开发成本(币安英雄+飞船系统开发)
|
5G 区块链 vr&ar
赛车链游DAPP开发丨赛车链游系统开发实现技术方案丨赛车链游源码部署
 在分布式数字身份系统中,用户身份信息管理是去中心化的,因此也可以避免被随意地泄露和篡改。基于这样的数字身份系统,个体在互联网空间中交流的基础是自己的身份数据,而不需要依赖于特定的第三方平台。而从平台的维度来看,分布式数字身份也更有利于平台之间的平等合作,共同为用户提供服务。
赛车链游DAPP开发丨赛车链游系统开发实现技术方案丨赛车链游源码部署
SwiftUI 面面观
前言 Swift 5.1 新语法 单表达式隐式返回值 根据结构体默认成员合成默认初始化器 字符串插入运算符新设计 属性包装器 不透明返回类型 Swift Style DSL / Function Builder 其他新特性 Swift 从 3.x Attribute Swift/SwiftUI API Design Guide 值类型和引用类型
1518 0
|
JSON 移动开发 开发框架
使用 phaser3 从零实现一个战疫小游戏
在本文中,我将从零开发一个 H5 游戏,主要使用 phaser3 来制作的游戏。结合当下疫情的严峻形式,我也将一些元素融入到这款游戏中,同时希望疫情早日结束,早点摘下口罩,可以看到彼此脸上洋溢的笑容
952 0
|
JSON 供应链 JavaScript
NFT卡牌/盲盒/对战/农场链游系统开发方案详细(源码分析)
  一是人机交互技术。这是元宇宙最核心的关键技术之一,主要包括VR虚拟现实技术、AR增强现实技术、MR混合现实技术、全息影像技术、脑机交互技术和体感技术,为元宇宙用户提供了虚拟沉浸现实的体验阶梯,不断深化感知交互。沉浸式交互设备为玩家进入元宇宙提供了真实、持久且顺畅的交互体验,是真实世界与元宇宙的桥梁,而沉浸感的实现需要依托于一个终端设备接口来实现。具备3D显示、大视角高分辨率的AR/VR/MR有望成为元宇宙世界的重要接入方式。