什么是GCD
Grand Central Dispatch (GCD)是Apple開發的一個多核編程的解決方法。該方法在Mac OS X 10.6雪豹中首次推出,並隨后被引入到了iOS4.0中。GCD是一個替代諸如NSThread, NSOperationQueue, NSInvocationOperation等技術的很高效和強大的技術,它看起來象就其它語言的閉包(Closure)一樣(在Swift確實成為了閉包),但蘋果把它叫做blocks。
我們一般使用如下的dispatch方法:
解釋:
第一句是異步執行,第二句是延遲異步執行,第三句是先后台運行,再更新UI
dispatch_get_main_queue 代表應用主線程執行,可以在內部更新UI(並不會阻塞主線程)
dispatch_get_global_queue 代表在系統后台運行,不一定和UI在同一線程,不能更新UI,適用於網絡處理與Core Data等的處理。
修改block之外的變量
訪問變量
默認情況下,在程序塊中訪問的外部變量是賦值(assign)過去的,即寫操作不對原變量生效。但是你可以加上 __block來讓其寫操作生效,示例代碼如下:
__block int a = 0;
void (^foo)(void) = ^{
a = 1;
}
foo();
// 這里,a的值被修改為1
訪問對象
如果是在代碼塊內部訪問self等對象,建議用弱指針引用后再在代碼塊(閉包)中使用
OC 中
__weak __typeof(&*self) ws = self;
Swift中,在閉包內聲明
[unowned self]
另外
GCD還有一些高級用法,例如讓后台2個線程並行執行,然后等2個線程都結束后,再匯總執行結果。這個可以用dispatch_group, 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), ^{
// 匯總結果
});
Ref: