GCD的解釋及原理網(wǎng)上已經(jīng)有詳細(xì)的介紹了,這里我就只是把自己項目中常用到的記錄下來挟阻,如果大家有更多的項目運用衅枫,請留言,我會及時學(xué)習(xí)并摘錄進(jìn)來阅悍,讓不太喜歡理論而喜歡實際操作的人學(xué)到更多好渠。
1、耗時操作
場景:(1)耗時操作:數(shù)據(jù)量比較大节视,而我們不可能一直等數(shù)據(jù)請求完再來刷新UI
? ? ? ? ? ?(2)增量更新:先加載本地數(shù)據(jù)拳锚,再請求接口是否有更新,如果有更新寻行,請求數(shù)據(jù)后再回到主線程更新UI霍掺,同時更新數(shù)據(jù)庫
? ? ? ? ? ? (3)。。抗楔。棋凳。。连躏。
/**
*? 解決耗時操作 - UI + 數(shù)據(jù)請求
*/
-(void)demo1
{
? ? NSLog(@"star");
? ?dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
? ? ? ? //這里操作耗時的任務(wù) 不管block是否運行結(jié)束剩岳,都不會阻塞UI線程
? ? ? ? for (NSInteger i = 0; i < 10; i ++) {
? ? ? ? ? ? NSLog(@"你好");
? ? ? ? }
? ? ? ? // dispatch_async會向dispatch_get_global_queue全局隊列去添加新的任務(wù)
? ? ? ? //網(wǎng)絡(luò)請求
? ? ? ? //加載網(wǎng)絡(luò)圖片
? ? ? ? //數(shù)據(jù)解析
? ? ? ? dispatch_async(dispatch_get_main_queue(), ^{
? ? ? ? ? ? NSLog(@"執(zhí)行完了 - 刷新主線程");
? ? ? ? });
? ? });
? ? NSLog(@"end");
}
2、多個接口操作
場景:(1)接口過多:現(xiàn)在一個接口越來越不能滿足一個界面的需求入热,通常需要多個接口來管理一個界面的UI(增量更新同樣可以用到)
? ? ? ? ? ? (2)拍棕。。勺良。绰播。
/**
*? 多個耗時操作異步執(zhí)行? - 再去刷新UI
*/
-(void)demo2
{
? ? NSLog(@"star");
? ? //線程
? ? dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
? ? //創(chuàng)建分組
? ? dispatch_group_t group = dispatch_group_create();
? ? dispatch_group_async(group, queue, ^{
? ? ? ? for (NSInteger i = 0; i < 10; i ++) {
? ? ? ? ? ? NSLog(@"數(shù)據(jù)請求1");
? ? ? ? }
? ? });
? ? dispatch_group_async(group, queue, ^{
? ? ? ? for (NSInteger i = 0; i < 10; i ++) {
? ? ? ? ? ? NSLog(@"數(shù)據(jù)請求2");
? ? ? ? }
? ? });
? ? /**
? ? *? 回到主線程
? ? */
? ? dispatch_group_notify(group, dispatch_get_main_queue(), ^{
? ? ? ? NSLog(@"刷新UI");
? ? });
? ? NSLog(@"end");
}