简介


  • 通过NSOperation与NSOperationQueue的组合也能实现多线程
  • 通常将任务封装成NSOperation对象,并将对象添加到NSOperationQueue中实现

NSOperation


  • NSOperation是一个抽象类,不能用来直接封装操作,通常使用它的子类来封装操作

  • 若不将NSOperation对象添加到NSOperationQueue中,操作只会在当前线程执行,且需要手动开始执行操作

  • NSoperation的子类

    • NSInvocationOperation

      //创建操作
      NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
      //开始执行操作
      [operation start];
    • NSBlockOperation(当操作数大于1时,异步执行)

      //创建操作
      NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
      //操作封装的任务代码
      }];
      //添加操作
      [operation addExecutionBlock:^{
      //操作封装的任务代码
      }];
      //开始执行操作
      [operation start];
    • 自定义子类的步骤

      • 重写- (void)main方法,在该方法中封装需要执行的操作
      • 在- (void)main方法中,需要自己建立自动释放池(原因:若是异步操作,无法访问主线程的自动释放池)
      • 通过检查cancelled等属性,来判断操作的状态,执行相应的操作
  • 设置操作完成时的回调

    //创建操作
    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
    //任务代码
    }];
    //设置回调
    operation.completionBlock = ^{
    //操作完成时执行的代码
    };

NSOperationQueue


  • 作用

    • 容纳需要异步执行的操作
    • 系统会自动执行NSOperationQueue中的操作,不需要手动启动
  • NSOperationQueue的相关操作
    • 创建操作队列

      • [[NSOperationQueue alloc] init]
    • 获取主操作队列
      • + (NSOperationQueue *)mainQueue
    • 获取当前操作队列
      • + (nullable NSOperationQueue *)currentQueue
    • 往队列中添加操作
      • - (void)addOperation:(NSOperation *)op
      • - (void)addOperationWithBlock:(void (^)(void))block
    • 设置最大并发操作数
      • - setMaxConcurrentOperationCount:(NSInteger)count
      • 若并发操作数为1,则为串行队列
    • 暂停/启动队列中的任务
      • - setSuspended:(BOOL)b
    • 取消队列中的任务
      • - (void)cancelAllOperations
      • 等到正在执行的任务执行完毕,队列才会被挂起

实现多线程的步骤


  • 创建操作队列

    NSOperationQueue *queue = [[NSOperationQueue alloc] init]
  • 往队列中添加操作

    /**
    方法一
    */
    //创建操作
    NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil] //download为操作封装的任务方法
    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
    //任务代码
    }];
    //添加操作
    [queue addOperation:operation1];
    [queue addOperation:operation2]; /**
    方法二
    */
    //添加操作
    [queue addOperationWithBlock:^{
    //操作封装的任务
    }];

操作依赖


  • 作用

    • 建立操作之间的执行顺序关系
    • 操作依赖是面向操作的,可以跨队列建立操作之间的依赖关系
    • 若要建立操作之间的依赖关系,必须在操作被添加到队列之前建立
  • 建立操作依赖的步骤
    • 创建操作队列

      NSOperationQueue *queue = [[NSOperationQueue alloc] init]
    • 添加操作

      NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
      //任务1代码
      }];
      NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
      //任务2代码
      }];
    • 建立依赖关系(必须在操作被添加到队列之前)

      [operation1 addDependency:operation2];
    • 将操作添加到队列

      [queue addOperation:operation1];
      [queue addOperation:operation2];

线程之间的通信


  • 从主线程到子线程

    • 从主线程到子线程的切换,通常是系统自动完成的,只需要将操作添加到队列中,系统就会根据实际需要,是否切换到子线程中执行操作
  • 从子线程到主线程
    • 将需要执行的操作,添加到主操作队列中即可(该操作将运行在主runLoop的common模式下)

      [[NSOperationQueue mainQueue] addOperationWithBlock:^{
      //需要在主线程中执行的任务代码
      }];

iOS多线程-03-NSOperation与NSOperationQueue的更多相关文章

  1. IOS多线程(NSOperation,NSOperationQueue)

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

  2. iOS自学之NSOperation、NSOperationQueue、Background

    iOS中多线程编程主要分为NSThread.NSOperation和GCD,今天主要记录下自己在学习NSOperation中的点滴-如有不对的地方帮忙指出下,PS:人生第一次写blog,各位看官请轻虐 ...

  3. iOS多线程编程--NSOperation(转)

    这篇文章写得非常不错,基础用法都涉及到了,我把文章提到的例子都写到了demo里面, 原文地址: iOS多线程--彻底学会多线程之『NSOperation』 demo下载:https://github. ...

  4. iOS 多线程之 NSOperation 的基本使用

    1.NSOperation,NSOperationQueue 简介 NSOperation,NSOperationQueue是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.NSO ...

  5. iOS开发多线程篇—NSOperation简单介绍

    iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...

  6. iOS-----使用NSOperation与NSOperationQueue实现多线程

    使用NSOperation与NSOperationQueue实现多线程 NSOperation与NSOperationQueue的基本理论如下. NSOperationQueue 代表一个FIFO的队 ...

  7. iOS开发——多线程篇——NSOperation(基于GCD多线程编程),下载图片并合成新图片

    一.NSOperation的基本概念1.简介NSOperation的作用配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperatio ...

  8. [iOS 多线程 & 网络 - 1.3] - NSOperation

    A.NSOperation的基本使用 1.NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperatio ...

  9. iOS多线程编程之NSOperation的基本操作(转载)

    一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperat ...

  10. iOS多线程与网络开发之NSOperation

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...

随机推荐

  1. 哀悼我的第一次"创业"经历

    下周考完最后一科,大学四年时光基本上算是落下帷幕,剩下的就只是整整毕业设计了.如果按照正常的节奏,这个学期应该能够搞完毕业设计的2/3,但无奈还在广州的一家公司里面实习,没有多少时间弄,得拖到3月了. ...

  2. 深入浅出 JavaScript 中的 this

    在 Java 等面向对象的语言中,this 关键字的含义是明确且具体的,即指代当前对象.一般在编译期确定下来,或称为编译期绑定.而在 JavaScript 中,this 是动态绑定,或称为运行期绑定的 ...

  3. Angular系列----AngularJS入门教程01:AngularJS模板 (转载)

    是时候给这些网页来点动态特性了——用AngularJS!我们这里为后面要加入的控制器添加了一个测试. 一个应用的代码架构有很多种.对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模 ...

  4. Copy和MutableCopy

    实现拷贝的方法 -copy: 1.只会产生不可变的副本对象(比如:NSString) 2.[NSMutableString copy] 产品一个不可变的nsstring对象 -mutaleCopy: ...

  5. PP66 EEPPPPMM SSyysstteemm AAddmmiinniissttrraattiioonn GGuuiiddee 16 R1

    ※★◆●PP66 EEPPPPMM SSyysstteemm AAddmmiinniissttrraattiioonn GGuuiiddee 16 R1AApprriill 22001166Conte ...

  6. c# 正则表达式 匹配中括号&颜色过滤

    现在需要匹配 [color=#000000],以"[color"开头,以"[/color]"结束,中间字符数量不限制,最后返回所有匹配的下标. 代码如下: // ...

  7. PHP+MySql例子

    对于熟悉做网站的人来说,要想网站做成动态的,肯定要有数据库的支持,利用特定的脚本连接到数据库,从数据库中提取资料.向数据库中添加资料.删除资料等.这里我通过一个实例来说明如何用php连接到数据库的. ...

  8. SQL SERVER实例解析

    什么是SQL SERVER实例 ------------ SQL SERVER实例的概念和“类与对象”的概念很相似.可以把SQL SERVER的安装程序看做是一个类,安装过程则是创建对象的过程,创建出 ...

  9. C++隐藏规则

    在面向对象的开发过程中,经常出现类的继承,这里面出现的成员函数的重载(overload).覆盖(override)与隐藏(hidden)很容易混淆. 首先澄清这3个概念: 重载 相同的范围(在同一个类 ...

  10. C#实现的18位身份证格式验证算法

    18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999<公民身份号码>中做了明确的规定. GB11643-1999<公民身份号码>为GB1164 ...