NSOperationQueue的学习

简介

NSOperationQueue是一种面向对象的处理线程工作的技术,在gcd 式的函数式编程上进行的封装,并联合kvo 对一些状态做了监听,同时加入了依赖等操作,使得开发中在操作程序流程控制上更加省事。

NSOperation的操作类

1. NSOperation

   这个类是用于定义自定义操作对象的基类,子类化NSOperation可以完全控制您自己的操作的实现,包括更改操作执行的默认方式并报告其状态的能力。

2.NSInvocationOperation

   一个你同时使用一个或多个block对象的类。因为它可以执行多个block,block操作对象使用组语义进行操作; 只有当所有关联的block完成执行时,操作本身被认为完成。

3.NSInvocationOperation

    您根据应用程序创建基于对象和选择器的操作对象的类,简言之,类似于UIbutton的target那种操作 

所有操作对象都支持以下主要功能:
1,支持在操作对象之间建立基于图形的依赖关系。这些依赖关系阻止给定的操作运行,直到其所依赖的所有操作完成运行
2,支持可选的completion block,该操作在操作的主要任务完成后执行
3,支持优先操作,从而影响其相对执行顺序 也就是支持操作的优先级
4,支持 cancel setSuspended 等
5,支持使用KVO通知监视对您的操作执行状态的更改,kvo监听到你操作的进程

创建Operation对象

1. 创建NSInvocationOperation对象
- (NSOperation*)taskWithData:(id)data {
    NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self
                    selector:@selector(myTaskMethod:) object:data];
 
   return theOp;
}

// This is the method that does the actual work of the task.
- (void)myTaskMethod:(id)data {
    // Perform the task.
}

2.创建NSBlockOperation对象
NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{
      NSLog(@"Beginning operation.\n");
      // Do some work.
   }];
   

执行Operations

    到目前为止,执行操作的最简单的方法是使用作为NSOperationQueue类的一个实例的操作队列。您的应用程序负责创建和维护其打算使用的任何操作队列。应用程序可以具有任意数量的队列,但是在给定时间点可能执行多少操作有实际的限制。操作队列与系统一起工作,将并发操作数限制为适用于可用内核和系统负载的值。因此,创建其他队列并不意味着您可以执行其他操作。要创建一个队列,您可以像应用其他对象一样在应用程序中分配队列:


NSOperationQueue * aQueue = [[NSOperationQueue alloc] init];//创建队列


   要将操作添加到队列中,请使用该addOperation:方法。在OS X v10.6及更高版本中,您可以使用该addOperations:waitUntilFinished:方法添加一组操作,也可以使用该方法将块对象直接添加到队列中(不带相应的操作对象)addOperationWithBlock:。这些方法中的每一个都会排队一个操作(或操作),并通知队列应该开始处理它们。在大多数情况下,在添加到队列后不久就会执行操作,但由于几个原因,操作队列可能会延迟执行排队操作。具体来说,如果排队操作依赖于尚未完成的其他操作,则可能会延迟执行。如果运行队列本身被挂起或正在执行其最大并发操作数,则执行也可能会被延迟。
    // 把operation添加到队列中 的三种方式
    [aQueue addOperation:anOp]; //添加单个操作
    [aQueue addOperations:anArrayOfOpswaitUntilFinished:NO]; //添加多个操作
    [aQueue addOperationWithBlock:^ {
   /* 做一点事。* /
     }];

operation之间的依赖

1.当某个NSOperation对象依赖于其它NSOperation对象的完成时,就可以通过addDependency方法添加一个或者多个依赖的对象,只有所有依赖的对象都已经完成操作,当前NSOperation对象才会开始执行操作。注意:不要造成循环依赖 如果A依赖B, B依赖A 结果会是如何,你懂得。另外,通过removeDependency方法来删除依赖对象。
D0F77D00-6964-4719-8634-51374B142F96.png
72B6D054-5DDE-431D-A491-E74B90064C9E.png

设置最大并发操作数

虽然NSOperationQueue该类是为并行执行操作而设计的,但是可以强制单个队列一次只运行一个操作。该setMaxConcurrentOperationCount:方法允许您配置操作队列对象的最大并发操作数

[aQueue setMaxConcurrentOperationCount:1];//设置队列的最大并发操作数量

取消操作 和 等待操作完成

  [aQueue cancelAllOperations];//取消队列里的所有操作
  [operation1 cancel];//本操作取消
  
 // 阻塞当前线程,等待queue的所有操作执行完毕
    [queue waitUntilAllOperationsAreFinished];

本文只是记录了简单的使用 介绍 可参考官方文档https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091-CH101-SW1
可以看看AFN GCDAsyncSockcet 等三方库中的应用

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

推荐阅读更多精彩内容