歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

iOS多線程開發之GCD

GCD全稱為Grand Central Dispatch 在IOS4才開始,用來實現多線程。它是IOS多線程抽象層次最高的一層,下面還有更加輕量級的Cocoa operations,和Thread。

當看到GCD的使用我仿佛看到了Android中的Handler和AsynTask。

  1. 在主線程中任意方法中加入:  
  2.   
  3.      dispatch_async(dispatch_get_gloabal_queue(0, 0), ^{  
  4.         //加入耗時操作   
  5.         //......   
  6.         dispatch_async(dispatch_get_main_queue(), ^{  
  7.             //更新UI操作   
  8.             //.....   
  9.         });  
  10.   
  11.     });  
  12.       
  13. 是否看到Android中Handler的影子? 首先需要在主線程中定義  
  14.     private Handler mHandler = new Handler();  
  15.     然後在子線程中使用  
  16.     mHandler.post(){  
  17.         public void run() {  
  18.             //更新UI操作   
  19.         }  
  20.     }  
  21.       
  22. 或者是:  
  23.     在主線程中:  
  24.     private Handler mHandler = new Handler() {  
  25.         public void handleMessage(Message msg) {  
  26.             switch(msg.what) {  
  27.                 case 1:  
  28.                     ....  
  29.                     break;  
  30.             }  
  31.         }  
  32.           
  33.     };  
  34.     在子線程中:  
  35.     Message message =  new Message();  
  36.     message.what = 1;  
  37.     mHandler.sendMessage(message);  

dispatch_async(dispatch_get_main_queue(), ^{.....});的作用是將代碼塊中的工作轉回到主線程。

並發操作:有很多沒有關聯的耗時操作我們可以考慮使用並發操作。GCD提供實現並發操作的方法

  1. //因為不知是哪個線程先返回,www.linuxidc.com 故使用__block修飾變量來保存執行結果,確保在子線程中程序塊內設置的值可供在以後得代碼中使用。retain,是為了防止到程序最後變量已被釋放,那就是白忙活了   
  2. __block NSString *firstResult;  
  3. __block NSString *secondResult;  
  4.   
  5. //分發線程執行操作   
  6. dispatch_group_async(group, dispatch_get_gloabal_queue(0, 0), ^{  
  7.     firstResult = [[ ...] retain];  
  8. });  
  9.   
  10. //分發線程執行操作   
  11. dispatch_group_async(group, dispatch_get_gloabal_queue(0, 0), ^{  
  12.     secondResult = [[ ...] retain];  
  13. });  
  14.   
  15. //該程序塊在組中所有程序塊即將執行完時執行   
  16. dispatch_group_notify(group, dispatch_get_gloabal_queue(0, 0), ^{  
  17.     //....   
  18.     dispatch_async(dispatch_get_main_queue(), ^{  
  19.         //更新UI操作   
  20.         //.....   
  21.     });  
  22. });  

在上面的代碼中是否看到了Android中AsyncTask的影子?

    doInBackground(...){...}

    onPostExecute(....){...}

Copyright © Linux教程網 All Rights Reserved