成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解IOS開發應用之并發Dispatch Queues

移動開發 iOS
詳解IOS開發應用之并發Dispatch Queues是本文喲啊介紹的內容,我們幾乎可以調度隊列去完成所有用線程來完成的任務。

詳解IOS開發應用之并發Dispatch Queues是本文喲啊介紹的內容,我們幾乎可以調度隊列去完成所有用線程來完成的任務。調度隊列相對于線程代碼更簡單,易于使用,更高效。下面講主要簡述調度隊列,在應用中如何使用調度隊列去執行任務。

1、關于調度隊列

所有的調度隊列都是先進先出隊列,因此,隊列中的任務的開始的順序和添加到隊列中的順序相同。GCD自動的為我們提供了一些調度隊列,我們也可以創建新的用于具體的目的。

下面列出幾種可用的調度隊列類型以及如何使用。

(1)serial queues(串行隊列)又稱私有調度隊列(private),一般用再對特定資源的同步訪問上。我們可以根據需要創建任意數量的串行隊列,每一個串行隊列之間是并發的。

(2)并行隊列,又稱global dispatch queue。并行隊列雖然可以并發的執行多個任務,但是任務開始執行的順序和其加入隊列的順序相同。我們自己不能去創建并行調度隊列。只有三個可用的global concurrent queues。

(3)main dispatch queue 是一個全局可用的串行隊列,其在行用程序的主線程上執行任務。此隊列的任務和應用程序的主循環(run loop)要執行的事件源交替執行。因為其運行在應用程序的主線程,main queue經常用來作為應用程序的一個同步點。

2、關于隊列的一些技術

除了調度隊列,GCD還提供了一些有用的技術來幫助我們管理代碼。

  1. dispath group ,dispatch semaphore, dispath sources 

3、使用blocks去實現tasks

block objects是基于C語言的特征,可以用在C,C++ Objective-c中。一個block雖然和函數指針有些相似,但是實際上代表一個底層數據結構,類似與對象,有編譯器去創建和管理。

block的一個優勢是可以使用其自己作用域外的變量,例如,一個block可以讀取其父作用域的變量值,此值是copy到了block heap的數據結構中。當block被加入到dispatch queue中,這些值通常為只讀形式。

block的聲明和函數指針類似,只是把*改為了^,我們可以傳遞參數給block,也可以接收其返回的值。

4、創建和管理調度隊列

(1)獲得全局并發調度隊列(global concurrent dispath queues)

系統給每一個應用程序提供了三個concurrent dispatch queues。這三個并發調度隊列是全局的,它們只有優先級的不同。因為是全局的,我們不需要去創建。我們只需要通過使用函數dispath_get_global_queue去得到隊列,如下:

  1. dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  

除了得到default的并發隊列,還可以通過傳遞參數DISPATCH_QUEUE_PRIOPITY_HIGH和DISPATCH_QUEUE_PRIOPITY_LOW去得到高優先級或者低優先級的。(第二個參數是為以后擴展保留的)

雖然dispatch queue是引用計數對象,但是在此因為隊列是全局的,不需要我們去retain或者release,我們需要使用的時候直接調用函數dispath_get_global_queue就可以。

(2)創建串行調度隊列

當想要任務按照某一個特定的順序執行時,串行隊列是很有用的。串行隊列在同一個時間只執行一個任務。我們可以使用串行隊列代替鎖去保護共享的數據。和鎖不同,一個串行隊列可以保證任務在一個可預知的順序下執行。

和并發隊列不同,我們要自己去創建和管理串行隊列,可以創建任意數量的串行隊列。當我們創建串行隊列時,應出于某種目的,如保護資源,或者同步應用程序的某些關鍵行為。

下面的代碼表述了怎么創建一個自定義的串行隊列,函數dispath_queue_create需要兩個參數,隊列的名字,隊列的屬性。調試器和性能工具顯示隊列的名字幫助我們去跟蹤任務是如何執行,隊列的屬性被保留供將來使用,應該為NULL

  1. dispatch_queue_t queue;  
  2. queue = dispatch_queue_create("com.example.MyQueue", NULL); 

除了自己創建的自定義隊列,系統會自動的給我創建一個串行隊列并和應用程序的主線程綁定到一起。下面講述如何獲得它。

(3)運行時獲得常見的隊列

GCD提供了一些函數讓我們能夠方便的訪問到common dispatch queues

使用dispatch_get_current_queue函數用來調試或者測試獲得當前隊列的標識。
  
使用函數dispatch_get_main_queue可以得到與應用程序主線程相連的串行調度隊列。

(4)調度隊列的內存管理

調度隊列是引用計數類型,當我們創建串行調度隊列時,我們要release它??梢允褂煤瘮礵ispatch_retain和dispatch_release去增加或者減少引用計數。

(5)在一個隊列中存儲自定義context information

所有的調度對象允許我們讓其與一個自定義上下文數據關聯,通過函數dispatch_set_context和dispatch_get_context來使用,系統不會去使用我們的自定義數據,我們自己在恰當的時間去分配和釋放。

對于隊列,上下文數據通常用來存儲一個指向對象的指針,或者其他的數據結構,我們可以在隊列的finalizer函數中去釋放context data。下面將給一個例子。

(6)為隊列提供一個clean up 函數。

當我們創建串行調度隊列之后,我們可以讓其和一個finalizer函數相連用來清理隊列中需要清理的數據。我們可以使用dispatch_set_finalizer_f函數去設置一個函數,當隊列的引用計數為0時會去自動的調用。使用此函數去清理和隊列相關聯的context data,當context 指針不會NULL時,此函數就會調用。

 

  1. shows a custom finalizer function and a function that creates a queue and installs that finalizer.   
  2. The queue uses the finalizer function to release the data stored in the queue’s context pointer.   
  3. (The myInitializeDataContextFunction and myCleanUpDataContextFunction functions referenced from the code are custom functions that   
  4. you would provide to initialize and clean up the contents of the data structure itself.)   
  5. The context pointer passed to the finalizer function contains the data object associated with the queue. 
  1. void myFinalizerFunction(void *context)  
  2. {  
  3. MyDataContext* theData = (MyDataContext*)context;  
  4. // Clean up the contents of the structure  
  5. myCleanUpDataContextFunction(theData);  
  6. // Now release the structure itself.  
  7. free(theData);  
  8. }  
  9. dispatch_queue_t createMyQueue()  
  10. {  
  11. MyDataContext* data = (MyDataContext*) malloc(sizeof(MyDataContext));  
  12. myInitializeDataContextFunction(data);  
  13. // Create the queue and set the context data.  
  14. dispatch_queue_t serialQueue = dispatch_queue_create("com.example.CriticalTaskQueue", NULL);  
  15. if (serialQueue)  
  16. {  
  17. dispatch_set_context(serialQueue, data);  
  18. dispatch_set_finalizer_f(serialQueue, &myFinalizerFunction);  
  19. }  
  20. return serialQueue;  

5、在隊列中添加一個任務

(1)有兩種方式在隊列中添加一個任務,同步或者異步。盡可能使用dispatch_async和dispatch_async_f 函數去執行,比同步的要***。當我們向隊列中添加一個塊對象或者函數時,我們沒有方法去知道此代碼什么時間執行。

使用此異步不會去阻塞主線程。

雖然盡可能異步添加任務,在有些時候同步的方式去添加一個任務會防止一些同步錯誤。同步的方式調用函數dispatch_sync和dispatch_sync_f。此函數阻塞主線程的執行,直到指定的任務完成。

下面是代碼例子:

 (2)在任務完成的時候執行completion block

當任務完成時,我們應用程序需要得到通知,一遍去合并結果,在傳統的異步編程中,我們可能會使用回調函數,但是在調度隊列中,我們使用completion block。

  1. void average_async(int *data, size_t len,  
  2.  
  3. dispatch_queue_t queue, void (^block)(int))  
  4. {  
  5. // Retain the queue provided by the user to make  
  6. // sure it does not disappear before the completion  
  7. // block can be called.  
  8. dispatch_retain(queue);  
  9. // Do the work on the default concurrent queue and then  
  10. // call the user-provided block with the results.  
  11. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
  12. int avg = average(data, len);  
  13. dispatch_async(queue, ^{ block(avg);});  
  14. // Release the user-provided queue when done  
  15. dispatch_release(queue);  
  16. });  

(3)并發的執行循環迭代(loop iterations)

對于for循環,如果每一次的迭代相互都沒有影響,可以并發的去執行迭代,使用函數dispatch_apply或者dispatch_apply_f 函數.

和正常的循環一樣,函數dispatch_apply或者dispatch_apply_f直到所有的循環迭代完成時才返回。

如下代碼:

  1. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  2. dispatch_apply(count, queue, ^(size_t i) {  
  3. printf("%un",i);  
  4. }); 

(4)在主線程上執行任務

我們可以通過調用函數dispatch_get_main_queue 去去得到主線程的調度隊列。

小結:詳解IOS開發應用之并發Dispatch Queues的內容介紹完了,希望通過本文的學習能對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-08-17 14:30:34

iOS開發窗口

2011-08-17 14:20:21

IOS開發GraphicsCon

2011-08-11 17:32:51

iPhone視圖

2011-08-17 14:07:43

IOS開發Quartz 2D

2011-08-11 10:16:23

iPhoneUIView視圖

2011-08-11 10:27:37

iPhoneUIView視圖

2011-08-10 10:23:20

iPhoneArchivingNSCoder

2011-08-16 19:02:23

iPhone開發繪圖

2011-08-22 16:26:25

IOS開發Sqlite數據庫

2011-08-15 18:02:32

iPhone開發表視圖

2017-02-14 10:00:19

Java開發Lock

2011-08-11 11:51:07

iPhone鍵盤

2011-08-12 11:31:46

iPhoneUIView動畫

2011-08-15 10:15:00

iPhone開發警告框

2011-05-11 10:02:37

iOS

2018-08-15 12:43:52

iOSAndroid設計差異

2011-08-02 11:07:42

iOS開發 UIWebView

2011-08-19 14:27:29

iPhone開發

2009-07-15 09:59:36

MyEclipse使用

2009-07-15 09:59:36

MyEclipse使用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人精品亚洲日本在线观看 | 成人免费视频 | 精品日韩在线 | 国产精品成人国产乱一区 | 天天干天天操天天爽 | 一区二区av | 欧美精品第一区 | 国产在线中文字幕 | 精品91久久 | 国产精品视频二区三区 | 在线视频 亚洲 | 天久久| 国产一区二区三区在线 | 日韩中文字幕在线 | 亚洲每日更新 | 在线观看日本高清二区 | 777777777亚洲妇女| 福利网站在线观看 | 欧美中文在线 | 久久精品国产一区二区电影 | 亚洲免费精品 | 日本成人中文字幕在线观看 | 欧美三区视频 | 久草色视频 | 午夜久久久 | 国产免费av在线 | 91视频官网 | 亚洲欧美日韩国产综合 | 蜜臀久久99精品久久久久久宅男 | 亚洲综合在线视频 | 欧美在线成人影院 | 日韩综合一区 | 狠狠干美女 | 午夜视频一区二区 | 亚洲精品在线91 | 久久久久网站 | 欧美久久天堂 | 天天草天天爱 | 成人久草| 欧美一区二区三 | 人人鲁人人莫人人爱精品 |