標籤:
我們一般使用如下的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:
http://stackoverflow.com/questions/17351810/difference-between-dispatch-get-main-queue-and-dispatch-get-global-queue
https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/index.html#//apple_ref/c/func/dispatch_main
http://blog.csdn.net/ericsuper/article/details/6998856
http://blog.csdn.net/marujunyy/article/details/8554920
Swift中的GCD——常見的dispatch方法