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
});
dispatch_group_t丶dispatch_group_async和dispatch_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秒鐘的時間做一些保存或者傾力資源的工作.但是應用可以調用UIApplication的beginBackgroundTaskWithExpirationHandler方法,讓應用最多有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線程的交互