1.简介

NSOperation实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作。

NSOperation本身是抽象基类,因此必须使用它的子类,使用NSOperation子类的方式有2种:

1> Foundation框架提供了两个具体子类直接供我们使用:NSInvocationOperation和NSBlockOperation

2> 自定义子类继承NSOperation,实现内部相应的方法

2.执行操作

NSOperation调用start方法即可开始执行操作,NSOperation对象默认按同步方式执行,也就是在调用start方法的那个线程中直接执行。NSOperation对象的isConcurrent方法会告诉我们这个操作相对于调用start方法的线程,是同步还是异步执行。isConcurrent方法默认返回NO,表示操作与调用线程同步执行

二、NSInvocationOperation

1.简介

基于一个对象和selector来创建操作。如果你已经有现有的方法来执行需要的任务,就可以使用这个类

  1. NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self
  2. selector:@selector(downloadImage:)
  3. object:kURL];

2.创建并执行操作

三、NSBlockOperation

1.简介

能够并发地执行一个或多个block对象,所有相关的block都执行完之后,操作才算完成

通过addExecutionBlock方法添加block操作,得到的是并发执行那个

即使是在operation开始执行之前。NSOperation类提供了取消operation的方法,但对于取消行为的处理需要程序自己去控制,如果operation被直接取消,那么可能就无法正确的释放之前分配的一些资源,所以通常情况下,运行中的operation在取消时,程序需要以正确的方式释放资源并退出。

只要在operation运行中定期的在合适的位置调用isCancelled方法,并在当返回值为YES时直接return即可。在程序逻辑中,常见的正确调用isCancelled的位置包括:

  1. 在实际执行工作之前
  2. 在每个循环的执行体中,如果一次执行体耗时很长可酌情添加调用次数
  3. 程序相对容易终止的代码处。
  4. 执行Operation

    1 .将operation对象添加到操作队列

    这是执行operation对象的最简单的方法,操作队列属于NSOperatinQueue类。应用程序负责创建和维护操作队列,Application可以创建任意数量的操作队列,但实际上operation的的并行执行数量是有限制的。操作队列会和系统一起来限制operation的并发执行数量,以保持合理的系统负载。所以,创建额外的操作队列不意味着你可以执行额外的操作。

    NSOperationQueue设计上是用来并发执行operation,但可以通过强制措施来保证一次运行一个operation。setMaxConcurrentOperationCount:方法可以设置操作队列并行执行的最大数量。设置为1可以保证一次运行一个operation,但operation的执行顺序却仍依赖于其它因素,如operation的就绪状态,优先级设置。所以串行化操作队列与串行化的GCD转发队列不同。需要设置operation间的依赖关系来保证它们的执行顺序是你想要的。

    2 .手动执行Operation

    可以在没有操作队列的前提下手动执行operation,但需要一些前提条件。尤其是operation对象必须准备好运行,并保证是调用start方法来执行。

    一个operation只有在其isReady方法返回YES时才被认为是可运行的。isReady方法会被整合进NSOperation的依赖管理系统来保证operation的依赖状态。只有在依赖关系清楚后,operation才开始运行。

    在手动执行operation时,必须调用其start方法。start方法在正式执行你得代码之前会做几个安全性检测。默认的start方法会生成operation依赖关系所需的KVO通知。同时保证已取消的operation不会再执行,以及在operation没就绪就开始运行时抛出异常。

iOS开发多线程编程2 - NSOperation的更多相关文章

  1. iOS开发多线程篇—自定义NSOperation

    iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...

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

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

  3. iOS开发多线程篇 10 —NSOperation基本操作

    iOS开发多线程篇—NSOperation基本操作 一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. ...

  4. IOS开发 多线程编程 - NSThread

    每个iOS应用程序都有个专门用来更新显示UI界面.处理用户的触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验.一般的解决方案就是将 ...

  5. IOS开发 多线程编程 - NSOperation

    一.NSOperation 1.简介 NSOperation实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作. NSOperation本身是抽象基类,因此必须使用 ...

  6. IOS开发 多线程编程 - NSOperationQueue

    一.简介 一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的.也可以将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步 ...

  7. ios开发多线程四:NSOperation多图下载综合案例

    #import "ViewController.h" #import "XMGAPP.h" @interface ViewController () /** t ...

  8. iOS开发多线程篇 11 —自定义NSOperation

    iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...

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

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

随机推荐

  1. redis的主从配置

    redis的主备配置比较简单,只需要在配置上新增slaveof属性即可,如果主节点需要密码验证,则在加上masterauth属性. 测试安装一个备用redis,备份前一章的节点redis的docker ...

  2. 最完整的数据倾斜解决方案(spark)

    一.了解数据倾斜 数据倾斜的原理: 在执行shuffle操作的时候,按照key,来进行values的数据的输出,拉取和聚合.同一个key的values,一定是分配到一个Reduce task进行处理. ...

  3. 【Hive五】Hive函数UDF

    Hive函数 系统自带的函数 查看系统自带的函数 查看系统自带的函数 show functions; 显示自带的函数的用法 desc function upper; 详细显示自带的函数的用法 desc ...

  4. python学习笔记:第18天 面向对象04-反射

    目录 issubclass和isinstance 区分函数和方法 反射 issubclass和isinstance issubclass:可以判断一个类是否另一个类的子类. # issubclass ...

  5. Leecode刷题之旅-C语言/python-202快乐数

    /* * @lc app=leetcode.cn id=202 lang=c * * [202] 快乐数 * * https://leetcode-cn.com/problems/happy-numb ...

  6. VS中添加lib与dll

    参考与拓展阅读:https://blog.csdn.net/u012043391/article/details/54972127 lib: 1.附加包含目录---添加工程的头文件目录:       ...

  7. C语言调整数组使奇数全部都位于偶数前面

    //输入一个整数数组,实现一个函数,//来调整该数组中数字的顺序使得数组中所有的奇数 位于数组的前半部分,//所有偶数 位于数组的后半部分. #include<stdio.h>#inclu ...

  8. 数据爬取后台(PHP+Python)联合作战

    一. 项目声明 本项目从前端,到后台,以及分布式数据抓取,乃我一个人所写,因此项目并不太完善!在语义分析以及数据处理上并不能尽如意.但是极大的减轻了编辑的工作量! 二. 项目所用技术 本项目中前端采用 ...

  9. 转:Docker创建centos的LNMP镜像

    转自:http://www.vckai.com/p/29  1. 安装docker 这个就不说了,不会的可以看下我之前的文章<Docker介绍及安装>. 1)启动docker # serv ...

  10. Linux工作环境搭建

    云主机工作环境搭建 网易云主机 需要申请弹性公网IP,不然需要OpenVPN才可以链接. 低于50块钱时,不能进行云主机创建. 更新yum源 cd /etc/yum.repos.d/ mkdir re ...