通过看小马哥视频总结:
NSOperation的作用:
配合使用NSOperation和NSOpetationQueue实现多线程编程
先将需要执行的操作封装到一个NSOperation对象中
然后将NSOperation对象添加到NSOpetationQueue中
系统会自动将NSOpetationQueue中的NSOperation对象取出来
将取出来的NSOperation封装的操作放到一条新的线程中执行
如果你的任务非常长,非常多的话,可以解耦。自定义NSOpetation中的时候要在.m中重写 -(void)main方法
在main中好处|:有利于代码隐蔽、 有利于代码复用性。
queue.maxConcurrentOperationCount=1;//最大并发操作数;同一时间最多有多少个任务可以执行。串行执行任务!=只开一条线程(线程同步),为1便是串行执行。为0不会执行任务。-1在计算机里面中特殊意义:表示最大值。
队列是一个数据结构。队列在执行任务过程中是可以暂停的,设置一个全局的队列(self.queue setSuspended:YES)暂停
self.queue setSuspended:YES当当前任务执行完毕后才会暂停。self.queue setSuspended:NO取消暂停,继续
如果你执行了self.queue cancelAlloperations 不可以恢复,取消任务。
队列中的任务也是有状态的“已经执行完毕的|正在执行|排队等待状态。
自定义operation main函数中如果有很多耗时操作:处理暂停,取消。
取消
判断当前操作是否执行self.queue cancelAlloperations在main函数在if(self.Cancelled)return;
NSBlockOperation *op任务,addDependency:依赖。不能循环依赖。可以跨队列依赖。
操作监听
op.completionBlock = ^{};op的任务执行完毕后执行。操作监听的block执行线程不一定是同一条线程。
线程间通信:
//1.创建队列
NSOperationQueue*queue = [[NSOperationQueuealloc]init];
NSBlockOperation*op1 = [NSBlockOperationblockOperationWithBlock:^{
//执行下载任务
//更新ui [[NSOperationQueue mainQueue] addOperationWIthBlock:^{
}];
}];
[queue addOperation:op1];
总结案例:
在tableviewcell中下载图片导致ui滑动不流畅:
开辟线程去执行图片下载任务:
图片重复下载:-》先把之前已经下载的图片保存起来,下次直接判断是否存在。
当程序退出后就会释放该全局字典。
在vc中创建一个全局字典,用懒方法加载。然后 setobject:forkey:保存到全局的字典中。
然后在下次再执行cell的代理方法的时候加上判断,判断该图片是否存在,如果存在就直接拿来用(objectforkey),否则再去下载。
由键取值,判断该图片是否存在,如果存在就直接使用,如果不存在就在去用NSURL去下载图片。