IOS并发编程(1)
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兼容,估计是好通知下一个操作来执行或准备。