你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS運用法式中經由過程dispatch隊列掌握線程履行的辦法

iOS運用法式中經由過程dispatch隊列掌握線程履行的辦法

編輯:IOS開發綜合

GCD編程的焦點就是dispatch隊列,dispatch block的履行終究都邑放進某個隊列中去停止,它相似NSOperationQueue但更龐雜也更壯大,而且可以嵌套應用。所以說,聯合block完成的GCD,把函數閉包(Closure)的特征施展得極盡描摹。

dispatch隊列的生成可以有這幾種方法:

1. dispatch_queue_t queue = dispatch_queue_create("com.dispatch.serial", DISPATCH_QUEUE_SERIAL); //生成一個串行隊列,隊列中的block依照先輩先出(FIFO)的次序去履行,現實上為單線程履行。第一個參數是隊列的稱號,在調試法式時會異常有效,一切盡可能不要重名了。

2. dispatch_queue_t queue = dispatch_queue_create("com.dispatch.concurrent", DISPATCH_QUEUE_CONCURRENT); //生成一個並發履行隊列,block被分發到多個線程去履行

3. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //取得法式過程缺省發生的並發隊列,可設定優先級來選擇高、中、低三個優先級隊列。因為是體系默許生成的,所以沒法挪用dispatch_resume()和dispatch_suspend()來掌握履行持續或中止。須要留意的是,三個隊列不代表三個線程,能夠會有更多的線程。並發隊列可以依據現實情形來主動發生公道的線程數,也可懂得為dispatch隊列完成了一個線程池的治理,關於法式邏輯是通明的。

官網文檔說明說共有三個並發隊列,但現實還有一個更低優先級的隊列,設置優先級為DISPATCH_QUEUE_PRIORITY_BACKGROUND。Xcode調試時可以不雅察到正在應用的各個dispatch隊列。

4. dispatch_queue_t queue = dispatch_get_main_queue(); //取得主線程的dispatch隊列,現實是一個串行隊列。異樣沒法掌握主線程dispatch隊列的履行持續或中止。

線程操作示例
為了便利地應用GCD,蘋果供給了一些辦法便利我們將block放在主線程或後台線程履行,或許延後履行。應用的例子以下所示:

 //  後台履行:
 dispatch_async(dispatch_get_global_queue(0, 0), ^{
      // something
 });


 // 主線程履行:
 dispatch_async(dispatch_get_main_queue(), ^{
      // something
 });


 // 一次性履行:
 static dispatch_once_t onceToken;
 dispatch_once(&onceToken, ^{
     // code to be executed once
 });


 // 延遲2秒履行:
 double delayInSeconds = 2.0;
 dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
 dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
     // code to be executed on the main queue after delay
 });

dispatch_queue_t也能夠本身界說,如要自界說queue,可以用dispatch_queue_create辦法,示例以下:

 // 自界說dispatch_queue_t
 dispatch_queue_t urls_queue = dispatch_queue_create("blog.devtang.com", NULL);
 dispatch_async(urls_queue, ^{ 
   // your code
 });
 dispatch_release(urls_queue);

別的,GCD還有一些高等用法,例如讓後台兩個線程並行履行,然後等兩個線程都停止後,再匯總履行成果。這個可以用dispatch_group_t、dispatch_group_async、dispatch_group_notify來完成,示例以下:

 // 歸並匯總成果
 dispatch_group_t group = dispatch_group_create();
 dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
      // 並行履行的線程一
 });
 dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
      // 並行履行的線程二
 });
 dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
      // 匯總成果
 });

dispatch隊列不支撐cancel(撤消),沒有完成dispatch_cancel()函數,不像NSOperationQueue,不能不說這是個小小的缺憾。

【iOS運用法式中經由過程dispatch隊列掌握線程履行的辦法】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved