简介


  • 通过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:^{
      //需要在主线程中执行的任务代码
      }];
 
 

OC - 14.NSOperation与NSOperationQueue的更多相关文章

  1. 用NSOperation和NSOperationQueue实现多线程编程

    1.上一讲简单介绍了NSThread的使用,虽然也可以实现多线程编程,但是需要我们去管理线程的生命周期,还要考虑线程同步.加锁问题,造成一些性能上的开销.我们也可以配合使用NSOperation和NS ...

  2. Swift - 多线程实现方式(2) - NSOperation和NSOperationQueue

    1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术: (1)NSThread (2)Cocoa NSOperation(NSOperation和NSOperationQueu ...

  3. GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

    转:http://www.tuicool.com/articles/NVVnMn (1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时 ...

  4. 多线程之NSOperation和NSOperationQueue

    这篇文章里我将不过多的谈及理论知识,这些东西会的自然会,不会的,看多了也是云里雾里.下面我讲更多的用代码+注释的方式来讲如何使用NSOperation和NSOperationQueue. 1.NSOp ...

  5. 多线程下的NSOperation和NSOperationQueue的使用

    多线程下的NSOperation和NSOperationQueue的使用 NSOperation和NSOperationQueue的介绍: NSOperation是Cocoa中的一个抽象类,用来封装单 ...

  6. iOS 多线程 NSOperation、NSOperationQueue

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

  7. NSOperation、NSOperationQueue(III)

    NSOperation.NSOperationQueue 常用属性和方法归纳 NSOperation 常用属性和方法 a. 取消操作方法 //可取消操作,实质是标记 isCancelled 状态. - ...

  8. NSOperation、NSOperationQueue(II)

    NSOperationQueue 控制串行执行.并发执行 NSOperationQueue 创建的自定义队列同时具有串行.并发功能 这里有个关键属性 maxConcurrentOperationCou ...

  9. 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

    (1)GCD实现的同步异步.串行并行. --同步sync应用场景:用户登录,利用堵塞 --串行异步应用场景:下载等耗时间的任务 /** * 由于是异步.所以开通了子线程.可是由于是串行队列,所以仅仅须 ...

随机推荐

  1. linux下svn使用及查看杀掉进程

    ps –aux ubuntu下安装subversion客户端: sudo apt-get install subversion svn正在checkout时候无法退出操作,shift+ctrl+t新建 ...

  2. oracle的基本信息查询

    oracle查看当前数据库实例名 select name from V$DATABASE; 或者 select SYS_CONTEXT('USERENV','INSTANCE_NAME') from ...

  3. devi into python 笔记(二)元组 变量声明 和列表解析

    元组tuple: 类似list,只是tuple是不可变的list.类似java的String都是不可改变的.注意:tuple没有方法(有待考证),不可以像list那样那个list.pop 或者list ...

  4. 格式化URL

    //格式化url查询参数为json function formatUrl(url){ var reg=/(?:[?&]+)([^&]+)=([^&]+)/g; var data ...

  5. poj 1696 Space Ant(模拟+叉积)

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3840   Accepted: 2397 Descrip ...

  6. sublime中文乱码解决办法

    欲解决问题,关键在于让Sublime Text 2支持GB2312和GBK.步骤如下: 1.安装Sublime Package Control. 在Sublime Text 2上用Ctrl+-打开控制 ...

  7. JDBC_demo:java连接mysql过程

    1.任何数据库驱动程序都提供对java.sql.Driver接口的驱动类,mysql-connector-java-5.1.39-bin.jar中Driver: package com.mysql.j ...

  8. JSON AND BSON

    JSON JavaScript Object Notation (JSON) is an open, human and machine-readable standard that facilita ...

  9. java实现简单的文件筛选

    package filenameFilter; import java.io.File; /* * 实现功能: * 获取指定路径下的指定格式的文件; * */ public class Test { ...

  10. 异常-JAVA

    #异常   ##1.异常处理概述   1.异常时程序在执行过程中所产生的问题.导致异常的原因的有很多种,包括:   1. 用户输入了无效数据   2. 找不到一个需要打开的文件   3. 在通讯过程中 ...