Swift中的GCD——常見的dispatch方法


什么是GCD

Grand Central Dispatch (GCD)是Apple開發的一個多核編程的解決方法。該方法在Mac OS X 10.6雪豹中首次推出,並隨后被引入到了iOS4.0中。GCD是一個替代諸如NSThread, NSOperationQueue, NSInvocationOperation等技術的很高效和強大的技術,它看起來象就其它語言的閉包(Closure)一樣(在Swift確實成為了閉包),但蘋果把它叫做blocks。

我們一般使用如下的dispatch方法:

image

解釋:

第一句是異步執行,第二句是延遲異步執行,第三句是先后台運行,再更新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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM