前言
在iOS 开发中, 实现多线程方案有:Operation Queue 、GCD、NSTread 。而大家经常哪来对比的便是NSOperationQueue 与 GCD。这里我结合代码对两者进行一次分析比较。欢迎大家转载注明出处,关注我的简书 Alan1_iOS。
基础概念
Operation Queue :是NSOperation 和 NSOperationQueue 的统称
GCD:Grand Central Dispatch,包含了Dispatch Queues 和 Dispatch Source。
两者间的关系
Operation Queue 是基于GCD封装的抽象类,目的是为了提高灵活度,以满足多线程操作频繁、灵活度要求高的复杂场景。
两者间的区别
1、实现多线程任务方式
GCD 是一个用于多核编程的轻量级底层解决方案,可以理解成是底层的C语言构成的API,通过block实现多线程任务,实现代码简洁。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
//异步下载图片代码
dispatch_async(dispatch_get_main_queue(), ^{
//返回主线程显示图片代码
});
});
NSOperation及NSOperationQueue是基于GCD封装的OC对象,作为对象可以提供更多操作选择,可以用方法或block实现多线程任务,同时也可以利用继承、类别等进行一些其他操作;但同时实现代码相对复杂一些。
NSInvocationOperation*invocationOperation = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(invocationOperationAction)object:nil];
NSBlockOperation*blockOperation = [NSBlockOperationblockOperationWithBlock:^{
//任务代码
}];
NSOperationQueue*queue = [[NSOperationQueuealloc]init];
queue.maxConcurrentOperationCount=10;
[queueaddOperation:blockOperation];
[queueaddOperation:invocationOperation];
2、功能灵活性
NSOperation: 可以给 Operation 之间添加依赖关系,这样的话尽管两个Operation处于同一个并行队列中,但前者会直到后者执行完毕后再执行,设置优先级也可以改变执行顺序;也可以对一个正在执行的 Operation 进行取消、暂停和恢复操作;还可以通过KVO对线程任务进行监听。
[blockOperationaddDependency:invocationOperation];
[blockOperationsetQueuePriority:NSOperationQueuePriorityNormal];
[queuecancelAllOperations];
[blockOperationcancel];
[blockOperationstart];
GCD:可以在串行队列和并发队列上,通过同步提交任务和异步提交任务两种方式操作多线程任务的执行任务,但是不能够取消、暂停、恢复多线程任务以及监听,只能简单地执行任务。
3、性能
GCD 是C语言底层实现,相对与NSOperation ,性能消耗会少一些。Operation Queue 为了提高灵活度在性能方面有所消耗。
总结
在对线程操作灵活度要求高的框架以及需面对随时更换的需求时采用Operation Queue,能够提高代码的扩展性,更为合理;而在普通简单实用多线程场景下,例如普通的异步加载图片等采用GCD,在代码简洁的情况下还能节省性能消耗。