IOS多线程相关NSOperation

通过看小马哥视频总结:

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去下载图片。

你可能感兴趣的:(IOS多线程相关NSOperation)