你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> IOS多線程GCD

IOS多線程GCD

編輯:關於IOS

1.GCD簡介
GCD是蘋果開發的一個多核線程的解決方法,GCD和其它的多線程技術方案想比,使用起來更加簡單和方便.
2.GCD的簡單實現

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //進行網絡請求數據操作
        dispatch_async(dispatch_get_main_queue(), ^{
            //回到主線程更新UI
        });
    });

3.系統提供的dispatch方法

  • 後台執行
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
          //you code
      });
  • 主線程執行
    dispatch_async(dispatch_get_main_queue(), ^{
          //you code
      });
  • 一次性執行
    static dispatch_once_t pred;
    dispatch_once(&pred, ^{
          //you code
      });
  • 延遲兩秒執行
    double delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^{
          //you code
      });
  • dispatch_queue_t也可以自己定義,如要自定義queue,可以用dispatch_queue_create方法,示例如下:
    dispatch_queue_t urls_queue = dispatch_queue_create("blog.devtang.com", NULL);
    dispatch_async(urls_queue, ^{
          //you code
      });
  • 另外,GCD還有一些高級用法,例如讓後台兩個線程並行執行,然後等兩個線程都結束後,再匯總執行結果.這個可以用dispatch_group_tdispatch_group_asyncdispatch_group_notify來實現,示例如下:
    <code>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), ^{
          //匯總結果
    });</code>

4.修改block之外的變量
默認情況下,在程序塊中訪問的外部變量是復制過來的,即寫操作不對原變量生效,但是你可以加上__Block來讓其寫操作生效,示例代碼如下:

__block int a = 0;
void (^foo)(void) = ^{
     a = 1;
};
foo();
//這裡,a的值被修改為1

5.後台運行
使用Block的另一個用處是可以讓成勳在後台較長久地運行.在以前,當應用被按Home鍵退出後,應用僅有最多5秒鐘的時間做一些保存或者傾力資源的工作.但是應用可以調用UIApplicationbeginBackgroundTaskWithExpirationHandler方法,讓應用最多有10分鐘的時間在後台長久運行,這個時間可以用來做清理本地緩存丶發送統計數據等工作.
讓程序在後台長久運行的示例代碼如下:
AppDelegate.h文件

<code>@property (assign , nonatomic) UIBackgroundTaskIdentifier backgroundUpdateTask;</code>

AppDelegate.m文件

-(void)applicationDidEnterBackground:(UIApplication *)application 
{
    [self beingBackgroundUpdateTask];
    //在這裡加上你需要長久運行的代碼
    [self endBackgroundUpdateTask];
}

-(void)beingBackgroundUpdateTask
{
    self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundUpdateTask];
    }];
}
-(void)endBackgroundUpdateTask
{
    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundUpdateTask];
    self.backgroundUpdateTask = UIBackgroundTaskInvalid;
}

6.總結
總體來說,GCD能夠極大地方便開發者進行多線程編程,大家應該盡量使用GCD來處理後台線程和UI線程的交互

 

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