NSOperation与NSOperationQueue的基本理论如下:
     1.NSOperationQueue代表一个FIFO的队列,它负责管理系统提交的多个NSOperation,NSOperationQueue底层维护一个线程池,会按顺序启动线程来执行提交给该队列的NSOperation任务。
     2.NSOperation:代表一个多线程任务,NSOperation还有NSInvocationOperation、NSBlockOperation两个子类。NSOperation有两种使用方式:
         1)开发者实现NSOperation的子类,
         2)开发者直接使用NSInvocationOperation或NSBlockOperation子类。
     NSInvocationOperation与NSBlockOperation在用法上非常相似,区别是NSInvocation用于将特定对象的特定方法封装成NSOperation,而NSBlockOperation则用于将代码块封装成NSOperation.
代码才是硬道理:
  1. //
  2. // ViewController.m
  3. // CX-NSOperationQueue
  4. //
  5. // Created by ma c on 16/3/15.
  6. // Copyright © 2016年 xubaoaichiyu. All rights reserved.
  7. //
  8.  
  9. /*
  10. GCD -- (iOS4.0)多线程解决方案
  11. 将任务(block)添加到队列(串行,并行(全局队列)),指定执行任务的方法。(同步,异步)
  12. 拿到dispatch_get_main_queue,线程之间的通信
  13.  
  14. NSOperation -- (iOS2.0) (后经苹果改造)
  15. 将操作添加到队列里
  16. [NSOperationQueue mainQueue] 获取主队列,将任务添加到主队列,就会在主线程中执行
  17. NSOperation可以设置最大并发数(用GCD处理,比较麻烦)
  18. 可以暂停可以继续,也就是挂起操作
  19. 取消所有的任务
  20. 设置依赖关系
  21. */
  22.  
  23. #import "ViewController.h"
  24.  
  25. @interface ViewController ()
  26. //NSOperation 队列
  27. @property (nonatomic, strong) NSOperationQueue * queue;
  28.  
  29. @end
  30.  
  31. @implementation ViewController
  32.  
  33. -(NSOperationQueue *)queue{
  34.  
  35. if (!_queue) {
  36. _queue = [[NSOperationQueue alloc]init];
  37. }
  38. return _queue;
  39. }
  40.  
  41. - (void)viewDidLoad {
  42. [super viewDidLoad];
  43. //线程间通信
  44. // [self contact];
  45. //最大并发数 注意观察测试时间
  46. [self maxCount];
  47.  
  48. //常用操作
  49. /*
  50. 取消操作:- (void)cancelAllOperations;
  51. 挂起操作:@property (getter=isSuspended) BOOL suspended;
  52. 依赖关系:- (void)addDependency:(NSOperation *)op;
  53. 取消依赖:- (void)removeDependency:(NSOperation *)op;
  54. */
  55.  
  56. }
  57.  
  58. -(void)maxCount{
  59.  
  60. self.queue.maxConcurrentOperationCount = ;
  61.  
  62. for (NSInteger i = ; i < ; i ++) {
  63.  
  64. NSInvocationOperation * operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
  65.  
  66. [self.queue addOperation:operation];
  67. }
  68. }
  69. -(void)test{
  70. [NSThread sleepForTimeInterval:];
  71. NSLog(@"%@",[NSThread currentThread]);
  72. }
  73. //线程间通信
  74. -(void) contact{
  75.  
  76. [self.queue addOperationWithBlock:^{
  77.  
  78. NSLog(@"%@",[NSThread currentThread]);
  79. NSLog(@"One");
  80.  
  81. [[NSOperationQueue mainQueue] addOperationWithBlock:^{
  82. NSLog(@"%@",[NSThread currentThread]);
  83. NSLog(@"Two");
  84. }];
  85. }];
  86. }
  87. - (void)test3 {
  88.  
  89. //NSOperation是基于GCD的,把GCD的block封装成opertion,NSOperationQueue是全局队列封装
  90. //将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步执行的。
  91.  
  92. //创建一个操作队列
  93. NSOperationQueue * queue = [[NSOperationQueue alloc] init];
  94.  
  95. NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(test) object:nil];
  96.  
  97. NSBlockOperation * op2 = [NSBlockOperation blockOperationWithBlock:^{
  98.  
  99. NSLog(@"op2 - %@",[NSThread currentThread]);
  100. }];
  101.  
  102. //添加NSOperation到NSOperationQueue中
  103. //NSOperation添加到queue之后,通常短时间内就会得到运行。
  104. // [queue addOperation:op];
  105. // [queue addOperation:op2];
  106.  
  107. // waitUntilFinished yes 操作完成后执行下面的代码 no 先执行下面的代码
  108.  
  109. //添加一个block形式的operation
  110. [queue addOperationWithBlock:^{
  111.  
  112. NSLog(@"op3 - %@",[NSThread currentThread]);
  113.  
  114. }];
  115.  
  116. [queue addOperations:@[op,op2] waitUntilFinished:NO];
  117.  
  118. // NSLog(@"完成");
  119.  
  120. }
  121.  
  122. - (void)test2 {
  123.  
  124. // 能够并发地执行一个或多个block对象,所有相关的block都执行完之后,操作才算完成
  125. NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
  126. NSLog(@"%@",[NSThread currentThread]);
  127.  
  128. NSLog(@"第一个操作");
  129. }];
  130.  
  131. // 通过addExecutionBlock方法添加block操作,开启多个线程
  132. [op addExecutionBlock:^{
  133.  
  134. NSLog(@"%@",[NSThread currentThread]);
  135.  
  136. NSLog(@"第二个操作");
  137. }];
  138.  
  139. [op addExecutionBlock:^{
  140.  
  141. NSLog(@"%@",[NSThread currentThread]);
  142.  
  143. NSLog(@"第三个操作");
  144. }];
  145.  
  146. [op start];
  147. }
  148.  
  149. - (void)test1 {
  150.  
  151. // 基于一个对象和selector来创建操作。如果你已经有现有的方法来执行需要的任务,就可以使用这个类
  152.  
  153. NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(test) object:nil];
  154.  
  155. // 如果我们想在一个NSOperation执行完毕后做一些事情,就调用NSOperation的setCompletionBlock方法来设置想做的事情
  156. [op setCompletionBlock:^{
  157. NSLog(@"完成");
  158. }];
  159.  
  160. // 开始执行任务(同步执行)
  161. // 一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的。
  162. [op start];
  163.  
  164. }
  165. @end

*有关进程与线程我会进行总结*

*由于昨天网络出现问题,昨晚把代码写出来了,但是没有上传

IOS NSOperation&NSOperationQueue的更多相关文章

  1. iOS中的多线程NSThread/GCD/NSOperation & NSOperationQueue

    iOS多线程有四套多线程方案: Pthreads NSThread GCD NSOperation & NSOperationQueue 接下来我来一个一个介绍他们 Pthreads 在类Un ...

  2. IOS多线程(NSOperation,NSOperationQueue)

    含义:NSOperation,NSOperationQueue是什么. The NSOperation class is an abstract class you use to encapsulat ...

  3. iOS NSOperation

    iOS NSOperation 一.简介 除了,NSThread和GCD实现多线程,配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOp ...

  4. iOS开发之NSOperation & NSOperationQueue

    1.简介 (1) NSOperationQueue(操作队列)是由GCD提供的队列模型的Cocoa抽象,是一套Objective-C的API,为了使并发(多线程)编程变得更加简单,但效率比GCD略低. ...

  5. iOS NSOperation的使用

    先给出NSOpetation的官方指导https://developer.apple.com/library/ios/documentation/Cocoa/Reference/NSOperation ...

  6. iOS -NSOperation并发编程

    http://www.cocoachina.com/game/20151201/14517.html http://blog.csdn.net/qinlicang/article/details/42 ...

  7. iOS NSOperation 封装 通知实现界面更新

    #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface MYOperation : NSOpe ...

  8. iOS NSOperation 异步加载图片 封装NSOperation 代理更新

    #import <Foundation/Foundation.h> @class MYOperation; @protocol MYOperationDelecate <NSObje ...

  9. iOS 中NSOperationQueue,Grand Central Dispatch , Thread的上下关系和区别

    In OS X v10.6 and later, operation queues use the libdispatch library (also known as Grand Central D ...

随机推荐

  1. google翻译,翻译当前的网页

    网页翻译为德语(Translate Page To German) <a href="javascript: void(window.open('http://translate.go ...

  2. RTX发送消息提醒实现以及注意事项

    一.RTX简介 RTX是腾讯公司推出的企业级即时通信平台.该平台定位于降低企业通信费用,增强企业内部沟通能力,改善企业与客户之间的沟通渠道,创造新兴的企业沟通文化,提高企业生产力.RTX平台的主要功能 ...

  3. 参数嗅探(Parameter Sniffing)(2/2)

    在参数嗅探(Parameter Sniffing)(1/2)里,我介绍了SQL Server里参数嗅探的基本概念和背后的问题.如你所见,当缓存的计划被SQL Server盲目重用时,会带来严重的性能问 ...

  4. 拓扑图弹力布局呈现Flickr图片搜索结果

    十年前有值得分享的图片我都存在Flickr上,可惜yahoo收购了Flickr之后堕落​好多年,最近yahoo在梅姐带领下Flickr团队终于恢复了生机,个人免费存储空间扩充到了1T,界面用户体验也有 ...

  5. 0414-复利计算器6.0.Release

    复利计算器6.0--Release 前言 本次复利计算器的版本更新,主要有以下内容的完善: 1.优化了Web版的页面,提供了更舒服美观的用户体现. 2.新增了移动端(安卓)app版本. 版本信息 项目 ...

  6. JS 中对象的简单创建和继承

    对象的简单创建 1.通过对象直接量创建 比如 var obj = {}; 2.通过new 创建 比如 var obj = new Object(); // 相当于var obj = {}; var a ...

  7. C#使用基类的引用 and 虚方法和覆写方法

    结论:使用基类的引用,访问派生类对象时,得到的是基类的成员. 虚方法和覆写方法

  8. Linq查询简介

    查询是一种从数据源检索数据的表达式. 查询通常用专门的查询语言来表示. 随着时间的推移,人们已经为各种数据源开发了不同的语言:例如,用于关系数据库的 SQL 和用于 XML 的 XQuery. 因此, ...

  9. css 布局absolute与relative的区别

    absolute:当使用时,表示在文档流中没有实际存在位置(浮动),在不设置任何方位值时,只能按兵不动,当设置了方位值之后,会紧接着去寻找距离最近的能够将它包含住的父级元素,然后进行定位. relat ...

  10. 使用VS GDB扩充套件在VS上远端侦错Linux上的C/C++程序

    在 Linux 上开发 C/C++ 程序,或许你会直接(本机或远端)登入 Linux,打开编辑器写完代码后,就用 gcc/g++ 来编译,遇到要除错(debug)的时候,则会选择使用 gdb 来进行除 ...