iOS 并行开发技术之 NSOperation && GCD

                       一 前言

    我的上一篇文章浅析了iOS的多线程技术,提到过NSThread, NSRunloop等相关类,也提到直接基于线程去实现并行开发,多个线程的管理,线程间的通信等等都不是那么容易。并且直接基于线程编程有一个问题是不可能解决的,那就是:
The biggest problem is that threaded code does not scale very well to arbitrary numbers of cores. You cannot create as many threads as there are cores and expect a program to run well. What you would need to know is the number of cores that can be used efficiently, which is a challenging thing for an application to compute on its own. Even if you manage to get the numbers correct, there is still the challenge of programming for so many threads, of making them run efficiently, and of keeping them from interfering with one another.
   也就是说直接基于线程的并行编程,是不可能做到根据系统当前的资源和负载情况动态生产线程的数量以达到高效率并行运行程序的。而NSOperation,GCD能做到(利用这两种技术实现并行编程,线程的构造管理等都交给了系统)。
   NSOperation,GCD基本上让你脱离了线程的管理,两种使用都很简单。

   它们让你主要专注在你的程序需要做的工作上,在开始动手编程代码前,仔细分析一下你要开发的APP的所有任务,并对所有任务进行归类分解,分析那些分任务执行的顺序是独立的,那些是有依赖关系的。进行归类分解后,就可以着手编程了,把要执行的分任务用function或者block封装编写好。



 二 NSOperation

  1 任务的封装
        我们分解好了的分任务都是用一个NSOperation封装起来的,NSOperation是一个抽象类,我们必须继承它去实现几个必须的方法。当然我们也可以用直接拿过来就可以用的NSOperation的几个子类,比如NSInvocationOperation,NSBlockOperation等。

 2 任务的执行
     a, 我们可以手动调用NSOperation 的start方法,让它去执行。
     b, 最为常见的,也是最方便的方法,构造一个NSOperationQueue, 把NSOperation add到NSOperationQueue中,它就会尽快去自动执行了。

 3 NSOperation有顺序执行的处理
   一般我们把NSOperation add到一个NSOperationQueue中,各个NSOperation的执行的是并行的。如果各个NSOperation的执行是有先后顺序的,那么我们就可以利用NSOperation 的 addDependency: 来构建一个依赖视图。 

 4  NSOperation间和线程间的通信
    NSOperation实现通信是通过KVO来实现的。比如我们需要知道当前这个NSOperation是否已经执行完成,可以通过它的isFinished来获知。
(To set a completion block, use the setCompletionBlock: method of NSOperation. The block you pass tothis method should have no arguments and no return value. )



三 GCD


 NSOperation是面向对象的编程,GCD的技术是基于C语言的,个人感觉GCD比NSOperation使用上还简单得多。

1 任务的封装
        我们分解好了分任务只要封装在function或 block中就好了。

 2 任务的执行
     a, 调用dispatch_async 和 dispatch_async_f 
     b, 调用dispatch_sync和 dispatch_sync_f 
其中后者会堵塞调用者所在线程,前者不会,所以一般情况我们用前者。

 3 有顺序要求的与无顺序要求的任务
   dispatch_queue_t分为几类,可以达到相应的要求。  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值