1. 程式人生 > >iOS 之 GCD(1)

iOS 之 GCD(1)

寫在前面的話:希望大家帶著批判的眼光,閱讀我的部落格。將不足和遺漏一一指出。

先來點實際的,專案中常用到的。(如有遺漏歡迎補充)

1.利用GCD進行延時操作。

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( ① * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        ②
    });

說明
①: 這裡寫延時的時間,型別是double。(可以精確到零點幾秒)
②:這裡寫延遲時間後 要執行的程式碼。

2.利用GCD進行單例的宣告

#import "UserCenter.h"

static UserCenter * userCenter = nil;
@implementation UserCenter

+(UserCenter *)sharedInstance{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        userCenter = [[UserCenter alloc]init];
    });
    return userCenter;
}
@end

以上是.m的實現。

這裡我也把正常的單例宣告寫一下。


#import "UserCenter.h"

static UserCenter * userCenter = nil;
@implementation UserCenter

+(UserCenter *)sharedInstance{
    @synchronized(self) {
        if (!userCenter) {
            userCenter = [[UserCenter alloc]init];
        }
    }
    return userCenter;
}
@end

以上是正常單例.m的實現。
3.GCD開啟子執行緒,執行完回到主執行緒更新UI

dispatch_async(dispatch_get_global_queue(0 , 0), ^{
       ①
        dispatch_async(dispatch_get_main_queue(), ^{
            ②
        });
    });

①: 在這裡寫需要在子執行緒中要執行的程式碼
②:子執行緒中執行完畢後 回到主執行緒更新UI。

首先,學習GCD之前我認為有必要了解一些東西。

Serial VS Concurrent (序列 vs. 併發)
這些術語描述當任務相對於其它任務被執行,任務序列執行就是每次只有一個任務被執行,任務併發執行就是在同一時間可以有多個任務被執行。

Synchronous VS Asynchronous (同步 vs 非同步)
一個同步函式只在完成了它預定的任務後才返回。
一個非同步函式,剛好相反,會立即返回,預定的任務會完成但不會等它完成。
因此,一個非同步函式不會阻塞當前執行緒去執行下一個函式。

未完待續。