• NSOperation

    • 此类不能直接使用

      • NSInvocationOperation
      • NSBlockOperation
      • 定义一个类继承与它
    • NSInvocationOperation
      • 可以使用start执行操作
      • 在主线程中执行
    • NSBlockOperation
      • 可以使用start执行操作
      • 后期还可以额外的追加操作: addExecutionBlock
      • 第一个任务再主线程中执行, 后面追加的操作在子线程中执行
  • NSOperationQueue

  • NSOperationQueue和GCD对比

    • GCD

      • 并发: 自己创建, 全局
      • 串行: 自己创建, 主队列
    • NSOperationQueue
      • 主队列: mainQueue

        • 永远在主线程中执行
      • 自己创建队列: alloc init
        • 会开启新的线程, 在子线程中执行
    • 如何控制并行和串行
      • maxConcurrentOperationCount = -1 ; 并行
      • 默认就是并行
      • maxConcurrentOperationCount = 1 ; 串行
      • maxConcurrentOperationCount = 0 ; 不会执行
    • 使用步骤:
      • 和GCD一样
      • 1.创建操作(任务)
      • 2.将任务添加到队列中
    • 快速添加任务的方法
      // 只要利用队列调用addOperationWithBlock:方法, 系统内部会自动封装成一个NSBlockOperation \
      然后再添加到队列中
      [queue addOperationWithBlock:^{
      NSLog(@"3 == %@", [NSThread currentThread]);
      }];
  • 队列的暂停和恢复以及取消

    • 暂停

      • self.queue.suspended = YES;
      • 注意点:暂停其实是暂停下一个任务, 而不能暂停当前任务
    • 恢复
      • self.queue.suspended = NO;
      • 注意点: 恢复之后会继续执行队列中没有被执行的操作
    • 取消
      • [self.queue cancelAllOperations];
      • 实现原理: 调用所有操作的cancel方法
      • 注意点: 取消其实是取消下一个任务, 而不能取消当前任务
      • 如果自定义操作中做了很多耗时操作, 苹果建议定期检查是否已经取消了
- (void)main
{
// 耗时操作1
for (int i = ; i < ; i++) { //
NSLog(@"%i ==== %@", i, [NSThread currentThread]);
}
NSLog(@"++++++++++++++++++++++++++++++++++++++");
  //判断是否已经取消了
if (self.isCancelled) {
return;
} // 耗时操作2
for (int i = ; i < ; i++) { //
NSLog(@"%i ==== %@", i, [NSThread currentThread]);
}
if (self.isCancelled) {
return;
}
NSLog(@"++++++++++++++++++++++++++++++++++++++");
// 耗时操作3
for (int i = ; i < ; i++) { //
NSLog(@"%i ==== %@", i, [NSThread currentThread]);
}
}

注: 另一种思路(未求证的) 再循环内部去判断,可以直接终止循环,而不需要等循环完全结束

  • 队列之间的依赖

    • 在操作添加到队列之前, 利用操作调用addDependency, 就快要添加依赖
    • 添加依赖之后, 只有所有依赖的任务都执行完毕, 才会执行当前任务
    • 注意点: 不要相互依赖
    • 特点: 跨队列依赖(GCD默认是不支持)
 // 3.添加依赖
[op5 addDependency:op1];
[op5 addDependency:op2];
[op5 addDependency:op3];
[op5 addDependency:op4];
  • 操作的监听

    • 只需要利用操作调用completionBlock即可
    • 只要任务执行完毕, 就会回调completionBlock
  • 线程间的通信

    • 将任务添加到自己创建的队列中
    • 再利用mainQueue回到主队列
  • SDWebImage

    • 已经实现内存/磁盘缓存, 并且能够防止重复下载
    • 一般情况会在applicationDidReceiveMemoryWarning方法中取消正在下载的任务
      [[SDWebImageManager sharedManager] cancelAll];
    • cleanDisk:
      • 清除已经过期的图片, 并且如果剩余的图片大于了最大的缓存大小, 会继续删除未过期的图片
    • clearDisk:
      • 删除缓存目录中所有的缓存图片 (内部就是删除了整个文件夹, 再重新创建一个)
    • SDWebImage默认的缓存时间是多长:
      • 1星期
    • SDWebImage是如何播放gif图片的
      • 取出gif中的每一帧图片, 重新生成了一张新的可动画的图片
    • 如何判断图片的类型
      • 判断图片的十六进制的前8字节

多线程 -- NSOperation的更多相关文章

  1. iOS多线程 NSOperation的用法

    上一篇写了 GCD 的使用,接下来就了解一下 NSOperation ,NSOperation是苹果对 GCD 的 OC 版的一个封装,但是相对于GCD来说可控性更强,并且可以加入操作依赖. NSOp ...

  2. iOS边练边学--多线程NSOperation介绍,子类实现多线程的介绍(任务和队列),队列的取消、暂停(挂起)和恢复,操作依赖与线程间的通信

    一.NSOperation NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加 ...

  3. iOS多线程--NSOperation 浅显易懂

    NSOperation是基于GCD的一套多线程实现方案,和GCD一样,线程的生命周期是由系统来自动管理的,不用像NSThread和Pthread一样让程序员手动管理.相对于GCD来说,它更加地面向对象 ...

  4. iOS开发:Swift多线程NSOperation的使用

    介绍: NSOperation是基于GCD实现,封装了一些更为简单实用的功能,因为GCD的线程生命周期是自动管理,所以NSOperation也是自动管理.NSOperation配合NSOperatio ...

  5. 多线程NSOperation

      NSOperation(经常使用): 1.为什么会有NSOperation?弥补gcd的一些问题:1)下载为例子:如果gcd放到队列中的block操作面对网络有问题,block之外无法取消bloc ...

  6. iOS多线程--NSOperation

    NSOperation是基于GCD的一套多线程实现方案,和GCD一样,线程的生命周期是由系统来自动管理的,不用像NSThread和Pthread一样让程序员手动管理.相对于GCD来说,它更加地面向对象 ...

  7. iOS之多线程NSOperation

    目前在 iOS 和 OS X 中有两套先进的同步 API 可供我们使用:NSOperation 和 GCD .其中 GCD 是基于 C 的底层的 API ,而 NSOperation 则是 GCD 实 ...

  8. iOS 多线程 NSOperation、NSOperationQueue

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

  9. iOS 开发多线程 —— NSOperation

    本文是根据文顶顶老师的博客学习而来,转载地址:http://www.cnblogs.com/wendingding/p/3809042.html 一.NSOperation简介 1.简单说明 NSOp ...

  10. iOS中的多线程 NSOperation

    在ios中,使用多线程有三种方式,分别是:NSThread.NSOperation和NSOperationQueue.GCD,在本节,主要讲解一下NSOperation的使用. NSOperation ...

随机推荐

  1. 现代福尔摩斯 - Oxygen Forensic Suite

    各位可曾听说过智能手机取证软件Oxygen Forensic Suite,它的logo是名侦探福尔摩斯一手抽着他的招牌雪茄,一手拿着放大镜,全神贯注地正进行调查工作. 使用过它的取证人员必定会对它的提 ...

  2. 学习使用LaTex排版文字输出为pdf(1)

    学习用latex写我的简历. 我在ubuntu环境下,先下载所需软件,命令百度就可以. 先创建一个a.tex,写上 \documentclass{article} \usepackage{CJK} \ ...

  3. ngrok逆向代理服务器搭建微信公众号本地开发环境

    一条命令解决的外网访问内网问题 本地WEB外网访问.本地开发微信.TCP端口转发 平台登陆地址:http://www.ngrok.cc/login 新版本上线启动方式更简单使用视频教程 在路由器上面的 ...

  4. projecteuler Smallest multiple

    2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any rema ...

  5. 生成.a文件步骤

    1.新建一个Project 选择 iOS->Framework & Library ->Cocoa Touch Static Library点击Next-> 输入Produc ...

  6. Linux命令行 3大技巧归纳

    在软件开发的世界中,作为web端程序猿打交道最多的操作系统相信就是Linux系统了吧.而对于Linux系统的使用,如果能掌握一些小技巧,在程序开发.调试的过程中,相信做事的效率也会有一些提升.下面就和 ...

  7. linux下source命令的基本功能

    source命令用法:source FileName作用:在当前bash环境下读取并执行FileName中的命令.注:该命令通常用命令“.”来替代.如:source .bash_rc 与 . .bas ...

  8. linux常用命令--ps、netstat、find

     一.ps 1.1ps命令简介 Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那 ...

  9. redis的数据类型

    redis有string,hash,list,sets.zsets几种数据类型 1.string数据类型 可包含任何数据,是二进制安全的,比如图片或者序列化的对象set key valueset na ...

  10. 用PHP生成随机数的函数(代码示例)

    转自:http://www.jbxue.com/article/5034.html 介绍:在早期的php中生成一个随机字符串时,总是先创建一个字符池,然后用一个循环和mt_rand()或rand()生 ...