iOS GCD知識點總結
引入
GCD(Grand Central Dispatch)是蘋果從OS X Snow Leopard 和 iOS4 開始引入的一套多執行緒開發的API,它是基於C語言的實現,其執行效率對比其他的多執行緒實現方式更高。其介面的呼叫很簡潔,使用起來十分方便。用蘋果爸爸的話來說,那就是:
開發者要做的只是定義想執行的任務並追加到適當的Dispatch Queue
既然有這麼好的東西在這裡,為什麼不好好地去使用它呢?
梳理點
-
多執行緒把原本順序執行的程式變成了多個流程來執行,各個流程之間的切換會有效能消耗,但在GCD的時候,永遠不用關注這些底層的事情。
蘋果爸爸說的那句話是追加,並不是執行,所以在需要考慮執行效率的地方使用GCD介面,一定要記住是追加,追加後並不一定是立刻就執行!!!
在iOS6以後的版本,不用考慮
dispatch_release()
和dispatch_retain()
的呼叫時機,系統以及將其交給ARC來處理。-
Dispatch Queue分為兩類,序列佇列和並行佇列,都是按照追加順序執行,但一個序列佇列總在一個執行緒中執行,會有等待,並行佇列會發起多執行緒併發執行,沒有等待。
Dispatch Queue可以通過
dispatch_queue_create
來建立,也可以從系統中來獲取,系統提供了兩類佇列:Main Dispatch Queue 和 Global Dispatch Queue,其中Main Dispatch Queue是序列佇列,Global Dispatch Queue是並行佇列,同時提供四個執行等級。建立多個序列佇列來操作同一個資源,會有資料競爭問題,用一個並行佇列來操作,不會造成多執行緒安全問題,並且多個並行佇列也不會。
dispatch_sync
指定一個序列佇列,會造成死鎖。dispatch_apply
會有阻塞執行緒問題,必須規定次數的block執行完,才走之後的程式碼。dispatch_walltime
可用來建立絕對時間dispatch_time_t
,相比dispatch_time
建立的相對時間,絕對時間可用來做定時器。dispatch_time_t
可用於dispatch_delay
和dispatch_group_wait
函式。
dispatch_time_t getDispatchTimeByDate(NSDate *date)
{
NSTimeInterval interval;
double second, subsecond;
struct timespec time;
dispatch_time_t milestone;
interval = [date timeIntervalSince1970];
subsecond = modf(interval, &second);
time.tv_sec = second;
time.tv_nsec = subsecond * NSEC_PER_SEC;
milestone = dispatch_walltime(&time, 0);
return milestone;
}
Some Special Ways
使用
dispatch_once
來執行只需執行一次的執行緒安全程式碼不要使用
dispatch_get_current_queue
,然而已經廢棄了,所以就別用了可以用Dispatch Queue取代同步鎖,這樣可以提高效率
少用
performSelect
,很多借口都可以通過GCD實現
NSOperationQueue是GCD的高層封裝,提供了和GCD相同的功能,雖然在效能上不如GCD,但在一些功能的實現上使用NSOperationQueue會更加簡便,在使用的時候可以仔細斟酌二者的區別,來覺得采用那種API。
使用NSOperationQueue的優點:
可以取消某個NSOperation,但必須在其啟動之前,通過這隻標誌位的方式,GCD則不能對單獨的一個block取消。
可以指定依賴關係,使一個操作必須依賴於其他操作。
可以給NSOperation設定KVO監聽,檢查每個NSOperation的執行狀態。
可以指定每個NSOperation的優先順序,NSOperationQueue的優先順序也可以指定;GCD只有佇列的優先順序可以改變,而且是通過指定到系統的佇列的方式。
可以建立NSOperation的子類,定製一些功能。
參考資料:
相關文章
- iOS 知識點總結iOS
- iOS 複製知識點總結iOS
- iOS 10 適配知識點總結iOS
- iOS基礎面試知識點總結iOS面試
- 知識點總結
- linux知識知識點總結Linux
- HDFS知識點總結
- MongoDB知識點總結MongoDB
- Java 知識點總結Java
- django知識點總結Django
- jQuery 知識點總結jQuery
- MySQL知識點總結MySql
- HBase知識點總結
- Kafka知識點總結Kafka
- JavaScript知識點總結JavaScript
- Java知識點總結Java
- pga知識點總結
- iOS推流器模組知識點淺談總結iOS
- CSS知識點面試總結CSS面試
- HBase知識點集中總結
- 事務知識點總結
- 知識點漏缺總結
- 前端知識點總結——Vue前端Vue
- java面試知識點總結Java面試
- 前端知識點總結——HTML前端HTML
- 前端知識點總結——DOM前端
- Java 面試知識點總結Java面試
- RabbitMQ 常用知識點總結MQ
- Tomcat 知識點總結Tomcat
- MySQL 索引知識點總結MySql索引
- HTML-知識點總結HTML
- 升級_知識點總結
- Spring知識點總結Spring
- Hibernate知識點總結
- Velocity知識點總結
- 零散知識點總結(3) Android 狀態列知識點總結Android
- iOS底層GCD (技術總結)iOSGC
- 總結 MySQL 相關知識點MySql