IOS并发编程(1)

 
一,并发貌似是个概念性东西,就是指同一时间可以执行多个函数;多线程是实现这种想法的技术实现,他是最基础的技术,其它技术都是对多线程来的封装,使得效率和易用性大大提高。
 
二,IOS中的并发编程常见的实现方式有:
1,异步函数调用,通常是系统提供的,通常在这个异步函数中会开启个线程,完成工作后,视情况回调到,调用这个异步函数的线程中。
如:[NSURLRequest 的 start] 方法,调用后立即返回;
2,手动开启线程,这个是各平台最通用的方法,一般出于两种目的:
a)干一件耗时的事情,干完就从工作者线程的main函数的出口出去了。比如,在程序启动的时候,加载缓存数据,我们可以开一个线程来做,完了,回调主线程刷新界面。
b)开个线程专门干一件事,干完一件就等待下一个,而不是返回。这样就需要手动创建线程,并且里面用使用无限循环,并调用RunLoop Run来使得这个线程,没事干的时候休息,来了消息就工作。像AFNetworking和ASIHTTP第三方库就是专门开一个线程请求网络。
3,dispatch queue(gcd),这个是IOS4.0开始提供的技术,优点是使用方便、效率高
        dispatch_async(dispatch_get_XXX_queue(), ^{

            //save data to file

        });

 这样就实现了在 XXX_queue所在的线程中异步保持文件;因为gcd是更底层的调度,创建线程的开销,和调度多核cpu,比我们自己搞线程效率更高。所以官方推荐用优先用gcd的方式而不是自己搞线程。即在IOS中上面2.a的情况,完全可用gcd来替代,效率高,不容易出错,至于2.b的情况,貌似还是得搞线程,因为gcd的线程不是我们创建的,自然不好控制他。

4.  NSOperationQueue,操作队列,优点是可以设置,操作(NSOperation)之间的依赖路径,并发个数,另外可以监视执行的进度。如果执行的多任务,有先后的依赖顺序,和别的相关联的特性,就适合用这个。(NSOperation)分两类Concurrent VS Non-Concurrent Operations,字面翻译为并发和非并发Operations,貌似这个并发与大的并发概念有所不同,先把他叫做默认方式和特殊方式的NSOperation。

a)默认方式(Non-Concurrent Operations),在Thread -> Operation start() ->Operations main()的调用过程中,不搞新的线程,执行完main函数就返回了。比如要干10个耗时的事,我们可以搞10个Operation,然后main函数中执行相应函数就行。

b)特殊方式(Concurrent Operations),如果我们在main()函数中,执行了异步函数,或者创建新线程了,就得用这种方式,因为调用异步函数后,会继续执行函数,很可能mian()函数执行完了,甚至这个线程都销毁了,这时异步回调才回来,这样这要崩溃了。比如,我们要请求10个异步网络请求,每个对应一个Operation,这时,就要搞成并发的,可以重载start()函数,把main()函数切换到另外的一个线程中去做,然后start()函数立即返回,因为我们重载了start()函数,这时候start()返回,并不会导致Operation执行结束,我们可以在网络请求真正完成的时候,用KVO的方式,告诉Operation完成了。

像IOS中有名的AFNetworking和ASIHTTP库就是这种搞法。NSOperation搞成并发的,需要重载NSOperation中的多个函数,并且对某些变量KVO兼容,估计是好通知下一个操作来执行或准备。

 

posted on 2012-12-07 12:29  武松  阅读(1386)  评论(0编辑  收藏  举报