GCD是蘋(píng)果開(kāi)發(fā)的一個(gè)多核編程的解決方法罪帖,GCD和其他的多線程技術(shù)方案相比喂走,使用起來(lái)更加簡(jiǎn)單和方便。
使用GCD
1.block的定義
//申明變量?
void (^ loggerBlock)(void);
//定義
loggerBlock = ^{
NSLog(@"Hello");
}
//調(diào)用
loggerBlock();
2.系統(tǒng)提供的dispatch方法
//后臺(tái)執(zhí)行
dispatch_async(dispatch_get_global_queue(0,0),^{
});
//主線程執(zhí)行
dispatch_async(dispatch_get_main_queue(),^{
});
//一次性執(zhí)行
static dispatch_once_t ?oneToken;
dispatch_once(&onceToken,^{
});
//延遲2秒執(zhí)行
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高級(jí)用法烧董,例如讓后臺(tái)兩個(gè)線程并行執(zhí)行州疾,然后等兩個(gè)線程都結(jié)束后,再匯總結(jié)果揪垄。
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group,dispatch_get_global_queue(0,0),^{//并行執(zhí)行的程序一});
dispatch_group_async(group,dispatch_get_global_queue(0,0),^{//并行執(zhí)行的程序二});
dispatch_group_notify(group,dispatch_get_global_queue(0,0),^{//匯總結(jié)果});
3.修改block之外的變量
默認(rèn)情況下穷吮,在程序塊中訪問(wèn)的外部變量是復(fù)制過(guò)去的,即寫(xiě)操作不對(duì)原變量生效饥努。但可以加上 ? __block來(lái)讓其生效捡鱼。
__block int a = 0;
void (^foo)(void) = ^{ a=1; }
foo(); //此時(shí) a的值被修改為1
4.后臺(tái)運(yùn)行
使用block的另一個(gè)用處是讓程序在后臺(tái)較長(zhǎng)久的運(yùn)行。在以前酷愧,當(dāng)應(yīng)用被按home鍵退出后驾诈,應(yīng)用最多5秒鐘的時(shí)間做一些保存或清理資源的工作缠诅。但是應(yīng)用可以調(diào)用UIApplication的beginBackgroundTaskWithExpirationHandler方法,讓?xiě)?yīng)用有10分鐘的時(shí)間在后臺(tái)運(yùn)行乍迄。這個(gè)時(shí)間可以用來(lái)做清理本地緩存管引、發(fā)送統(tǒng)計(jì)數(shù)據(jù)等工作。
@property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundUpdateTask;
- (void)applicationDidEnterBackground:(UIApplication *)application {
[self beginBackgroundUpdateTask];
//加上需要長(zhǎng)久執(zhí)行的代碼
[self endBackgroundUpdateTask];
}
- (void)beginBackgroundUpdateTask {
self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[self endBackgroundUpdateTask];
}];
}
- (void)endBackgroundUpdateTask {
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundUpdateTask];
self.backgroundUpdateTask = UIBackgroundTaskInvalid;
}