多线程 -- NSOperation
NSOperation
- 此类不能直接使用
- NSInvocationOperation
- NSBlockOperation
- 定义一个类继承与它
- NSInvocationOperation
- 可以使用start执行操作
- 在主线程中执行
- NSBlockOperation
- 可以使用start执行操作
- 后期还可以额外的追加操作: addExecutionBlock
- 第一个任务再主线程中执行, 后面追加的操作在子线程中执行
- 此类不能直接使用
NSOperationQueue
NSOperationQueue和GCD对比
- GCD
- 并发: 自己创建, 全局
- 串行: 自己创建, 主队列
- NSOperationQueue
- 主队列: mainQueue
- 永远在主线程中执行
- 自己创建队列: alloc init
- 会开启新的线程, 在子线程中执行
- 主队列: mainQueue
- 如何控制并行和串行
- maxConcurrentOperationCount = -1 ; 并行
- 默认就是并行
- maxConcurrentOperationCount = 1 ; 串行
- maxConcurrentOperationCount = 0 ; 不会执行
- 使用步骤:
- 和GCD一样
- 1.创建操作(任务)
- 2.将任务添加到队列中
- 快速添加任务的方法
// 只要利用队列调用addOperationWithBlock:方法, 系统内部会自动封装成一个NSBlockOperation \
然后再添加到队列中
[queue addOperationWithBlock:^{
NSLog(@"3 == %@", [NSThread currentThread]);
}];
- GCD
队列的暂停和恢复以及取消
- 暂停
- 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的更多相关文章
- iOS多线程 NSOperation的用法
上一篇写了 GCD 的使用,接下来就了解一下 NSOperation ,NSOperation是苹果对 GCD 的 OC 版的一个封装,但是相对于GCD来说可控性更强,并且可以加入操作依赖. NSOp ...
- iOS边练边学--多线程NSOperation介绍,子类实现多线程的介绍(任务和队列),队列的取消、暂停(挂起)和恢复,操作依赖与线程间的通信
一.NSOperation NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加 ...
- iOS多线程--NSOperation 浅显易懂
NSOperation是基于GCD的一套多线程实现方案,和GCD一样,线程的生命周期是由系统来自动管理的,不用像NSThread和Pthread一样让程序员手动管理.相对于GCD来说,它更加地面向对象 ...
- iOS开发:Swift多线程NSOperation的使用
介绍: NSOperation是基于GCD实现,封装了一些更为简单实用的功能,因为GCD的线程生命周期是自动管理,所以NSOperation也是自动管理.NSOperation配合NSOperatio ...
- 多线程NSOperation
NSOperation(经常使用): 1.为什么会有NSOperation?弥补gcd的一些问题:1)下载为例子:如果gcd放到队列中的block操作面对网络有问题,block之外无法取消bloc ...
- iOS多线程--NSOperation
NSOperation是基于GCD的一套多线程实现方案,和GCD一样,线程的生命周期是由系统来自动管理的,不用像NSThread和Pthread一样让程序员手动管理.相对于GCD来说,它更加地面向对象 ...
- iOS之多线程NSOperation
目前在 iOS 和 OS X 中有两套先进的同步 API 可供我们使用:NSOperation 和 GCD .其中 GCD 是基于 C 的底层的 API ,而 NSOperation 则是 GCD 实 ...
- iOS 多线程 NSOperation、NSOperationQueue
1. NSOperation.NSOperationQueue 简介 NSOperation.NSOperationQueue 是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.N ...
- iOS 开发多线程 —— NSOperation
本文是根据文顶顶老师的博客学习而来,转载地址:http://www.cnblogs.com/wendingding/p/3809042.html 一.NSOperation简介 1.简单说明 NSOp ...
- iOS中的多线程 NSOperation
在ios中,使用多线程有三种方式,分别是:NSThread.NSOperation和NSOperationQueue.GCD,在本节,主要讲解一下NSOperation的使用. NSOperation ...
随机推荐
- 用PHP实现守护进程任务后台运行与多线程(php-resque使用说明)
消息队列处理后台任务带来的问题 项目中经常会有后台运行任务的需求,比如发送邮件时,因为要连接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢慢处理发送邮件的操 ...
- 安装package.js
- iOS取证将如漫漫长夜
日前因恐攻一案,FBI对一支已上锁的iPhone 5c束手无策,美国法院出具命令要求苹果配合,但被苹果公司执行长库克以维护安全及隐私为由悍然拒绝. 平心而论,各有其立场,但在一个犯罪案件之中,真的可以 ...
- 十七、OGNL表达式
十七.OGNL OGNL简介: OGNL是对象导航图语言.它是一个独立的项目.早期的webwork框架用到了OGNL作为自己的表达式语言, 所以struts2也是用OGNL作为表达式语言,当然也可以使 ...
- slf4j+log4j配置
下载三个包: 三个包分别是:log4j的API包,slf4j的API包,slf4j对log4j的适配包. 选择使用slf4j一个重要的原因是支持占位符{},不用频繁操作字符串对象. 实现代码如下: i ...
- 缓存一致性(Cache Coherency)入门
作者: Fabian “ryg” Giesen 来源: infoq 参考原文:http://fgiesen.wordpress.com/2014/07/07/cache-coherency/ 本文是 ...
- C#去除List中集合的重复项(类型对象和单一类型)
去除重复类型对象BookInfo示例: bookList = bookList.Distinct(new DataRowComparer()).ToList(); //去除重复书籍 /// <s ...
- DataGridView取消默认选中行
DataGridView在添加数据后会默认选中第 一个单元格或者第一行,我就想取消它的默认选中行.在DataGridView绑定数据之后加上了ClearSelection().这样一来,不论是启动窗体 ...
- dataGridView 如何默认选中第一行
datagridview默认选中第一行方法: this.dataGridView1.Rows[0].Selected = true; datagridview 去除 默认选中第一行方法:在绑定data ...
- DOCTYPE对$(window).height()取值的影响
前言:公司项目需要用到一个弹框垂直居中,网上类似的垂直居中弹出层大同小异,因为项目是基于Jquery 下的,所以用$(window).height()-layer.height())/2 +$(doc ...