GCD

weixin_34120274發表於2016-05-31

GCD是蘋果開發的一個多核程式設計的解決方法,GCD和其他的多執行緒技術方案相比,使用起來更加簡單和方便。

使用GCD

1.block的定義

//申明變數 

void (^ loggerBlock)(void);

//定義

loggerBlock = ^{

NSLog(@"Hello");

}

//呼叫

loggerBlock();

2.系統提供的dispatch方法

//後臺執行

dispatch_async(dispatch_get_global_queue(0,0),^{

});

//主執行緒執行

dispatch_async(dispatch_get_main_queue(),^{

});

//一次性執行

static dispatch_once_t  oneToken;

dispatch_once(&onceToken,^{

});

//延遲2秒執行

double delayInSeconds = 2.0;

dispatch_time_ t popTime = dispatch_time(DISPATCH_TIME_NOW,delayInSeconds*NSEC_PER_SEC);

dispatch_after(popTime,dispatch_get_main_queue(),^(void){

});


GCD高階用法,例如讓後臺兩個執行緒並行執行,然後等兩個執行緒都結束後,再彙總結果。

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),^{//彙總結果});

3.修改block之外的變數

預設情況下,在程式塊中訪問的外部變數是複製過去的,即寫操作不對原變數生效。但可以加上   __block來讓其生效。

__block int a = 0;

void (^foo)(void) = ^{ a=1; }

foo(); //此時 a的值被修改為1

4.後臺執行

使用block的另一個用處是讓程式在後臺較長久的執行。在以前,當應用被按home鍵退出後,應用最多5秒鐘的時間做一些儲存或清理資源的工作。但是應用可以呼叫UIApplication的beginBackgroundTaskWithExpirationHandler方法,讓應用有10分鐘的時間在後臺執行。這個時間可以用來做清理本地快取、傳送統計資料等工作。

@property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundUpdateTask;

- (void)applicationDidEnterBackground:(UIApplication *)application {

[self beginBackgroundUpdateTask];

//加上需要長久執行的程式碼

[self endBackgroundUpdateTask];

}

- (void)beginBackgroundUpdateTask {

self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{

[self endBackgroundUpdateTask];

}];

}

- (void)endBackgroundUpdateTask {

[[UIApplication sharedApplication] endBackgroundTask:self.backgroundUpdateTask];

self.backgroundUpdateTask = UIBackgroundTaskInvalid;

}