NSOperationQueue知识讲解

我所知道的NSOpeartionQueue知识

OC里面的多线程,主要是GCD和NSOpeartionQueue两种,上一篇文章主要介绍了GCD(我所知道的GCD知识),这一篇主要是介绍NSOpeartionQueue

首先我们需要先了解一下NSOpeartion这个类

NSOpeartion opeartion是操作的意思,这个类就是苹果帮我们封装的一个操作类。看一下苹果文档的介绍

An abstract class that represents the code and data associated with a single task.
Because the NSOperation class is an abstract class, you do not use it directly but instead subclass or use one of the system-defined subclasses (NSInvocationOperation or NSBlockOperation) to perform the actual task. Despite being abstract, the base implementation of NSOperation does include significant logic to coordinate the safe execution of your task. The presence of this built-in logic allows you to focus on the actual implementation of your task, rather than on the glue code needed to ensure it works correctly with other system objects.
An operation object is a single-shot object—that is, it executes its task once and cannot be used to execute it again. You typically execute operations by adding them to an operation queue (an instance of the NSOperationQueue class). An operation queue executes its operations either directly, by running them on secondary threads, or indirectly using the libdispatch library (also known as Grand Central Dispatch). For more information about how queues execute operations, see NSOperationQueue.
If you do not want to use an operation queue, you can execute an operation yourself by calling its start method directly from your code. Executing operations manually does put more of a burden on your code, because starting an operation that is not in the ready state triggers an exception. The ready property reports on the operation’s readiness.

上面主要说的是:NSOpeartion类是一个抽象基类,是用来关联一个单独的任务。后面说的主要是我们需要使用它的子类NSInvocationOperation or NSBlockOperation 或者自己去写一个子类。用这些子类配合NSOpeartionQueue去使用。后面的我就翻译了,大家可以直接有道翻译。

经过上面的介绍后,我们大致知道了这个类是用来关联任务的,下面我们一起看一下苹果提供的api

初步了解

当然我们如果使用的话,还是先看它对应的子类NSInvocationOperationNSBlockOperation

NSOpeartion使用

NSInvocationOperation

调用操作类,api比较简单,就不帖了,使用如下:

使用

NSBlockOperation

block类型的操作类,使用如下:

使用

不知道大家注意没,上面两个图上都输出了任务执行所在的线程,这两种操作执行的任务都是在主线程执行的。我自己私下里做过试验,一般在哪条线程上创建的operation,其所执行的任务是会默认在这条线程上执行。

例如:

使用

当然NSBlockOperation这个类,还有一个添加任务的方法addExecutionBlock:,这个方法比较特殊。添加的任务不是在当前所在线程执行的。这个大家要注意一下

使用

自己初始化一个NSOpeartion子类

创建一个继承NSOpeartion的子类MSOperation。主要是重写-(void)main方法,如下:

-(void)main {
    NSLog(@"我是:雨天多久就");  
}
使用

上面是NSOpeartion的简单使用方法。但是一般我们使用NSOpeartion都是配合着NSOpeartionQueue使用的

流程是:创建operation,然后把这个operation加入到NSOpeartionQueue队列中

使用

注意看,加入到Queue中的opeartion是不需要再调用start方法才执行任务
另外,需要注意的是Queue的生成有两种方式:1.alloc init 2.[NSOperationQueue mainQueue]获取主队列

  • 通过alloc init方式创建的队列,默认是并发队列

    因为Queue的属性maxConcurrentOperationCount 默认是-1

    我们可以设置maxConcurrentOperationCount来决定同时间的任务执行数(最大并发数)

    因此,当我们设置这个属性值是1的时候,这个队列里的任务是一条一条顺序执行的

    如下图:

    使用

    而当我们不设置这个maxConcurrentOperationCount值的时候,队列里的任务是多条线程,并发执行

    使用
  • 通过[NSOperationQueue mainQueue]获取主队列,任务都是在主线程执行

    使用

    maxConcurrentOperationCount值设置不起作用

经过上面的介绍,我们会发现,这个Queue和GCD几乎也是一样的。

NSOpeartion 就类似 dispatch_async_函数后面跟着的block

NsopeartionQueue 就是 dispatch_async_函数后面参数里的queue

我觉得,NSOpeartionQueue对于复杂一点的操作比较合适。GCD也很方便,但是我一般都是简单的操作使用

使用OpeartionQueue,我们可以对队列里的任务进行依赖设置、取消等操作

  • 依赖设置
使用

虽然GCD也可以实现这种,但是我觉得在代码简洁上,还是这种方式更好

  • 取消

直接调用cancelAllOperations就可以将还未执行的任务取消掉


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • NSThread 第一种:通过NSThread的对象方法 NSThread *thread = [[NSThrea...
    攻城狮GG阅读 789评论 0 3
  • 原文链接:http://www.cocoachina.com/ios/20150807/12911.html 现如...
    Kevin追梦先生阅读 1,457评论 0 3
  • 概述 这篇文章中,我不会说多线程是什么、线程和进程的区别、多线程有什么用,当然我也不会说什么是串行、什么是并行等问...
    hashakey阅读 292评论 0 0
  • 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案...
    张战威ican阅读 601评论 0 0
  • 时隔3年,曾小发回到镇里便引起了沸腾。不为别的,只因他是镇里首个千万。这个古镇以前出过举人,更出过将军,商...
    十月城池阅读 344评论 0 3