NSOperation
NSOperation (操作 /任务)
基于GCD 的面向对象的封装 。
NSOperation 本身是个抽象类 。我们定义任务的时候 ,需要使用它的子类 :
队列
- 主队列:和GCD一样 ,主队列中的任务都是在主线程中完成
- 自定义队列 :开启新的线程
NSOperatonQueue *queue = [[NSOperationQueue alloc]init]
使用最大并发数 来区分是并发 还是串行 。
queue.maxConcurrentOperationCount =
队列直接可以添加bolck任务 ,并且自动执行
[queue addOperationWithBlock:^ {
};
挂起/暂停
queue.suspended = yes 后边队列中的任务就会被暂停操作 。
queue.suspended = no 继续执行 。
这样就可以很好的控制异步操作的 暂停和开启操作 。
可以完成这样的需求 ,在互用UI交互的时候 ,把异步的操作都暂停,保证UI的流畅 ,比如滚动列表 ,然后用户交互停止以后 ,再回复异步的复杂操作 。但是要注意 ,一个任务执行了一半是不能停止的 。
使用自定义的Operation-继承自NSOperation
需要重写 -(void)main{ }
在这个函数中做异步的 自定义的操作 。要注意 ,外部调用取消操作也是进入这个方法 ,所以要自己监控 。
if (self.isCanceled) return
做了一段耗时操作以后 ,就用这个方法检测一下,用户是否取消了 。
设置依赖 。和GCD 的阻拦函数一样的意思 。控制执行顺序 。
[op1 addDependency op2] 任务1 必须在任务2完成以后才能执行 。但是不影响其他的任务的并发性 。
异步任务执行完成后的监听回调
op1.completionBlock = ^{
};
注意 :这个监听也是在子线程中 。(但是不一定是和op1同个线程 ,GCD会自动的判断需不要创建新的)
Operation 直线线程间的通信
回到主线程,其实就是在 主队列中操作 [NSOperationQueue mainQueue] addOperatinWithBlock:^{}
定义代码块的时候
<# #>这样就可以出线自定义输入的提示框 。
SDWebImage 清楚图片的内存缓存 。
[SDWebImageManger shareManger].imageCache
有各种清除方法
- cleanDisk :马上移除过期的图片(默认的保存期限是一周)
- clearDisk :清空所有的硬盘缓存
- clearMenory :清空内存缓存 (当程序内存警告的时候就可以清空内存)