歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> iOS多線程開發之GCD

iOS多線程開發之GCD

日期:2017/3/1 11:11:06   编辑:Linux編程
GCD全稱為Grand Central Dispatch 在IOS4才開始,用來實現多線程。它是IOS多線程抽象層次最高的一層,下面還有更加輕量級的Cocoa operations,和Thread。

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

  1. 在主線程中任意方法中加入:
  2. dispatch_async(dispatch_get_gloabal_queue(0, 0), ^{
  3. //加入耗時操作
  4. //......
  5. dispatch_async(dispatch_get_main_queue(), ^{
  6. //更新UI操作
  7. //.....
  8. });
  9. });
  10. 是否看到Android中Handler的影子? 首先需要在主線程中定義
  11. private Handler mHandler = new Handler();
  12. 然後在子線程中使用
  13. mHandler.post(){
  14. public void run() {
  15. //更新UI操作
  16. }
  17. }
  18. 或者是:
  19. 在主線程中:
  20. private Handler mHandler = new Handler() {
  21. public void handleMessage(Message msg) {
  22. switch(msg.what) {
  23. case 1:
  24. ....
  25. break;
  26. }
  27. }
  28. };
  29. 在子線程中:
  30. Message message = new Message();
  31. message.what = 1;
  32. 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. dispatch_group_async(group, dispatch_get_gloabal_queue(0, 0), ^{
  6. firstResult = [[ ...] retain];
  7. });
  8. //分發線程執行操作
  9. dispatch_group_async(group, dispatch_get_gloabal_queue(0, 0), ^{
  10. secondResult = [[ ...] retain];
  11. });
  12. //該程序塊在組中所有程序塊即將執行完時執行
  13. dispatch_group_notify(group, dispatch_get_gloabal_queue(0, 0), ^{
  14. //....
  15. dispatch_async(dispatch_get_main_queue(), ^{
  16. //更新UI操作
  17. //.....
  18. });
  19. });

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

doInBackground(...){...}

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

Copyright © Linux教程網 All Rights Reserved