標籤:多線程 ios gcd operation 蘋果推薦
首先聲明一下,小湯我在實際開發中呢,實際上也是喜歡用GCD多一點,因為用起來感覺更方便。
但是,事實是什麼呢?
蘋果推薦使用的實際上是NSOperation,所以希望對此沒有研究的各位不要再在部落格中誤導他人了啊。
再換句話來說,蘋果開發使用的Objective-C語言就是物件導向的,她怎麼可能推薦大家使用基於C語言的面向過程開發的東西呢? (這句話只是吐槽,請勿噴…)
關於NSOperation
很多人,在部落格中說到NSOperation的時候呢,都會以它是iOS2.0推出的 這一點來強調後來iOS4.0推出的GCD才是蘋果推薦使用的多線程使用方式!
對於這一點,我覺得倒也不能全怪他們,因為很多人在開發中都是通過查資料來學習的,很少有願意看蘋果給出的 官方文檔 的。
事實上,蘋果在官方文檔中對此有專門的講到,NSOperation的確是iOS2.0推出的,那個時候的NSOperation是通過NSThread實現的,效率的確一般,但是!!
蘋果在iOS4.0推出GCD之後,又重寫了NSOperation,從此以後,NSOperation的底層就是由GCD實現的了!!
下面是官方文檔的原文:
(Operation queues usually provide the threads used to run their operations. In OS X v10.6 and later, operation queues use the libdispatch library (also known as Grand Central Dispatch) to initiate the execution of their operations. As a result, operations are always executed on a separate thread, regardless of whether they are designated as concurrent or non-concurrent operations. In OS X v10.5, however, operations are executed on separate threads only if their isConcurrent method returns NO. If that method returns YES, the operation object is expected to create its own thread (or start some asynchronous operation); the queue does not provide a thread for it.)
NSOperation和GCD的對比:
- 首先,這兩者相對於NSThread或者是跨平台的pthread而言,他們的線程的生命週期都是自動管理的,開發人員只要關注執行什麼樣的操作,不需要編寫任何線程管理的代碼
- GCD是蘋果公司為多核的並行運算提出的解決方案,會自動利用更多的CPU核心(比如雙核、四核),而NSOperation是基於GCD的物件導向的封裝,擁有GCD的特性。
GCD提供了一些NSOperation不具備的功能:
1) 一次性執行2) 順延強制 3) 調度組
GCD是將任務(block)添加到隊列(串列/並行/全域/主隊列),並且以同步/非同步方式執行任務的函數,而NSOperation將操作(一般是非同步任務)添加到隊列(一般是並發隊列),就會執行指定操作的函數。
NSOperation裡提供了一些方便的操作:
1) 最大並發數2) 隊列的暫訂/繼續3) 取消所有的操作4) 指定操作之間的依賴關係(GCD可以用同步實現)
其中,關於最大並發數這一條,就是蘋果推薦使用NSOperation的另一條強有力的佐證。
因為相對於蘋果以前限制了線程的最大並發數的這一情況而言,現在,
蘋果不再限制線程的最大並發數。
也就是說,這對於使用GCD開發是不利的,因為GCD是無法控制線程的最大並發數的,而線程的並發數一旦過多…你懂得~
所以,綜上,蘋果實際上推薦我們開發過程中使用的是NSOperation,不是GCD!還請各位在開發中稍加註意哦~
不要再坑人啦!NSOperation才是蘋果推薦使用的多線程技術!