GCD - 網(wǎng)絡(luò)多線程操作(組函數(shù)的使用)

GCD組函數(shù)的使用

使用場(chǎng)景:在開發(fā)中遇到過這樣的功能,某個(gè)界面列表上面是資源信息造烁,下面是評(píng)論列表信息欺嗤,而且資源信息和評(píng)論列表信息不是同一個(gè)接口,必須等兩者數(shù)據(jù)都獲取完畢的時(shí)候才能刷新UI

1综苔、dispatch_group_t和dispatch_group_async

    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
    // 1、
    dispatch_group_async(group, queue, ^{
        [NetworkTool postAlloc:@"http://www.reibang.com/" parameters:nil successed:^(id json) {
            NSLog(@"http://www.reibang.com/ --- success");
        } failure:^(NSError *error) {
            NSLog(@"http://www.reibang.com/ --- failure");
        }];
    });

    // 2位岔、
    dispatch_group_async(group, queue, ^{
        [NetworkTool postAlloc:@"https://www.baidu.com/" parameters:nil successed:^(id json) {
            NSLog(@"https://www.baidu.com/ --- success");
        } failure:^(NSError *error) {
            NSLog(@"https://www.baidu.com/ --- failure");
        }];
    });
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"dispatch_group_notify --- 結(jié)束");
    });

輸出結(jié)果

[ViewController.m:278行] dispatch_group_notify --- 結(jié)束
[ViewController.m:264行] http://www.reibang.com/ --- failure
[ViewController.m:271行] https://www.baidu.com/ --- success

說明:這時(shí)候問題來了如筛, [NetworkTool postAlloc:parameters:successed:failure]這是封裝的請(qǐng)求方法(異步函數(shù)),大家都知道抒抬,異步函數(shù)不會(huì)阻塞主線程杨刨,不等異步函數(shù)執(zhí)行完畢,dispatch_group_notify里的代碼就開始執(zhí)行了擦剑。
解決方法:請(qǐng)看下面的2妖胀、和3、實(shí)現(xiàn)惠勒。

2赚抡、dispatch_group_enter和dispatch_group_leave

 dispatch_group_t group = dispatch_group_create();
   
    dispatch_group_enter(group);
    [NetworkTool postAlloc:@"http://www.reibang.com/" parameters:nil successed:^(id json) {
        dispatch_group_leave(group);
        NSLog(@"http://www.reibang.com/ --- success");
    } failure:^(NSError *error) {
        dispatch_group_leave(group);
        NSLog(@"http://www.reibang.com/ --- failure");
    }];
    
    dispatch_group_enter(group);
    [NetworkTool postAlloc:@"https://www.baidu.com/" parameters:nil successed:^(id json) {
        dispatch_group_leave(group);
        NSLog(@"https://www.baidu.com/ --- success");
    } failure:^(NSError *error) {
        dispatch_group_leave(group);
        NSLog(@"https://www.baidu.com/ --- failure");
    }];
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"dispatch_group_notify --- 結(jié)束");
    });
        

輸出結(jié)果

[ViewController.m:233行] http://www.reibang.com/ --- failure
[ViewController.m:239行] https://www.baidu.com/ --- success
[ViewController.m:246行] dispatch_group_notify --- 結(jié)束

3、dispatch_group_t纠屋、dispatch_group_async和dispatch_semaphore_t結(jié)合實(shí)現(xiàn)

  //使用GCD的信號(hào)量 dispatch_semaphore_t 創(chuàng)建同步請(qǐng)求
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
    // 1涂臣、
    dispatch_group_async(group, queue, ^{
        dispatch_semaphore_t semaphore= dispatch_semaphore_create(0);
        //模擬網(wǎng)絡(luò)多線程耗時(shí)操作
        dispatch_group_async(group, queue, ^{
            sleep(5);
            NSLog(@"%@-->線程1結(jié)束。售担。赁遗。",[NSThread currentThread]);
            dispatch_semaphore_signal(semaphore);
        });
        NSLog(@"%@-->1結(jié)束闯估。。吼和。",[NSThread currentThread]);
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    });
    
    // 2涨薪、
    dispatch_group_async(group, queue, ^{
        dispatch_semaphore_t semaphore= dispatch_semaphore_create(0);
        
        //模擬網(wǎng)絡(luò)多線程耗時(shí)操作
        dispatch_group_async(group, queue, ^{
            sleep(3);
            NSLog(@"%@-->線程2結(jié)束。炫乓。刚夺。",[NSThread currentThread]);
            dispatch_semaphore_signal(semaphore);
        });
        
        NSLog(@"%@-->2結(jié)束。末捣。侠姑。",[NSThread currentThread]);
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    });
    
    dispatch_group_notify(group, queue, ^{
        NSLog(@"%@-->全部結(jié)束。箩做。莽红。",[NSThread currentThread]);
    });

    dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"%@---全部結(jié)束。邦邦。安吁。",[NSThread currentThread]);
        
    });

輸出結(jié)果

[ViewController.m:197行] <NSThread: 0x6000000755c0>{number = 6, name = (null)}-->1結(jié)束。燃辖。鬼店。
[ViewController.m:212行] <NSThread: 0x61000007f6c0>{number = 7, name = (null)}-->2結(jié)束。黔龟。妇智。
[ViewController.m:208行] <NSThread: 0x608000274dc0>{number = 10, name = (null)}-->線程2結(jié)束。氏身。巍棱。
[ViewController.m:194行] <NSThread: 0x600000264f40>{number = 11, name = (null)}-->線程1結(jié)束。蛋欣。航徙。
[ViewController.m:217行] <NSThread: 0x6000000755c0>{number = 6, name = (null)}-->全部結(jié)束。豁状。捉偏。

其他的實(shí)現(xiàn)方法有(OSSpinLock 倒得、pthread_mutex_t泻红、NSLock等):

#import <libkern/OSAtomic.h>
//#import <pthread.h>
     __block OSSpinLock spinLock = OS_SPINLOCK_INIT;
    //__block pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
    //NSLock *lock = [NSLock new];
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
    // 1、
    dispatch_group_async(group, queue, ^{
        //模擬網(wǎng)絡(luò)多線程耗時(shí)操作
        OSSpinLockLock(&spinLock);
        //pthread_mutex_lock(&mutex);
        //[lock lock];
        dispatch_group_async(group, queue, ^{
            sleep(5);
            NSLog(@"%@-->線程1結(jié)束霞掺。谊路。。",[NSThread currentThread]);     
        });
        NSLog(@"%@-->1結(jié)束菩彬。缠劝。潮梯。",[NSThread currentThread]);
        OSSpinLockUnlock(&spinLock);
        //pthread_mutex_unlock(&mutex);
        //[lock unlock];
    });
    
    // 2、
    dispatch_group_async(group, queue, ^{
        OSSpinLockLock(&spinLock);
        
        //模擬網(wǎng)絡(luò)多線程耗時(shí)操作
        dispatch_group_async(group, queue, ^{
            sleep(3);
            NSLog(@"%@-->線程2結(jié)束惨恭。秉馏。。",[NSThread currentThread]);
        });
        NSLog(@"%@-->2結(jié)束脱羡。萝究。。",[NSThread currentThread]);
        OSSpinLockUnlock(&spinLock);
    });
    
    dispatch_group_notify(group, queue, ^{
        NSLog(@"%@-->全部結(jié)束锉罐。帆竹。。",[NSThread currentThread]);
    });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脓规,一起剝皮案震驚了整個(gè)濱河市栽连,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侨舆,老刑警劉巖秒紧,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異挨下,居然都是意外死亡噩茄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門复颈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绩聘,“玉大人,你說我怎么就攤上這事耗啦≡淦校” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵帜讲,是天一觀的道長(zhǎng)衅谷。 經(jīng)常有香客問我,道長(zhǎng)似将,這世上最難降的妖魔是什么获黔? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮在验,結(jié)果婚禮上玷氏,老公的妹妹穿的比我還像新娘。我一直安慰自己腋舌,他們只是感情好盏触,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般赞辩。 火紅的嫁衣襯著肌膚如雪雌芽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天辨嗽,我揣著相機(jī)與錄音世落,去河邊找鬼。 笑死糟需,一個(gè)胖子當(dāng)著我的面吹牛岛心,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播篮灼,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼忘古,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了诅诱?” 一聲冷哼從身側(cè)響起髓堪,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎娘荡,沒想到半個(gè)月后干旁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炮沐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年争群,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片大年。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡换薄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翔试,到底是詐尸還是另有隱情轻要,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布垦缅,位于F島的核電站冲泥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏壁涎。R本人自食惡果不足惜凡恍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望怔球。 院中可真熱鬧嚼酝,春花似錦、人聲如沸庞溜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽流码。三九已至又官,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漫试,已是汗流浹背六敬。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驾荣,地道東北人外构。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像播掷,于是被迫代替她去往敵國(guó)和親审编。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容