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

來源:互聯網
上載者:User

標籤:

  我們一般使用如下的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方法

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.