多任務(wù)并發(fā)同步控制

需求:異步上傳5張圖片到服務(wù)器A,上傳成功后將返回的url以及相關(guān)信息傳給服務(wù)器B谨究⌒夂颍【保證 上傳給B的url順序與圖片的上傳順序相同】

方法1:

- (void)semaphoreA{
    NSLog(@"============= semaphoreA =======");
    NSArray *arr = @[@"aaa",@"bbb",@"ccc",@"ddd"];
    //有同時(shí)被寫入數(shù)據(jù)的情況 需要加線程鎖 此處用dispatch_semaphore_t鎖住 以保證數(shù)據(jù)安全
    NSMutableArray *addedArray = [NSMutableArray array];
    dispatch_semaphore_t semaLock = dispatch_semaphore_create(1);
    NSMutableArray *replaceArray = [NSMutableArray arrayWithArray:arr];
    for (int i = 0; i < arr.count; i++) {
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            NSObject *obj = [arr objectAtIndex:i];
            sleep(2);
            NSLog(@"image %@ index %tu has uploaded",obj,i);
            NSString *newObj = [NSString stringWithFormat:@"%@_%tu",obj,i];
            [replaceArray replaceObjectAtIndex:i withObject:newObj];
            dispatch_semaphore_wait(semaLock, DISPATCH_TIME_FOREVER);
            [addedArray addObject:newObj];
            dispatch_semaphore_signal(semaLock);
            
            if(addedArray.count == arr.count){
                NSLog(@"done");
                NSLog(@"replaceArray = %@",replaceArray);
                NSLog(@"addedArray = %@",addedArray);
            }

        });
    }
}
image.png

方法2.

- (void)semaphoreAA{
    
    NSLog(@"============= semaphoreAA =======");
    NSArray *arr = @[@"aaa",@"bbb",@"ccc",@"ddd"];
    //有同時(shí)被寫入數(shù)據(jù)的情況 需要加線程鎖 此處用dispatch_semaphore_t鎖住 以保證數(shù)據(jù)安全
    NSMutableArray *addedArray = [NSMutableArray array];
    dispatch_semaphore_t semaLock = dispatch_semaphore_create(1);
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);
    NSMutableArray *replaceArray = [NSMutableArray arrayWithArray:arr];
    for (int i = 0; i < arr.count; i++) {
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            NSObject *obj = [arr objectAtIndex:i];
            sleep(2);
            NSLog(@"image %@ index %tu has uploaded",obj,i);
            NSString *newObj = [NSString stringWithFormat:@"%@_%tu",obj,i];
            [replaceArray replaceObjectAtIndex:i withObject:newObj];
            dispatch_semaphore_wait(semaLock, DISPATCH_TIME_FOREVER);
            [addedArray addObject:newObj];
            dispatch_semaphore_signal(semaLock);
            
            if(addedArray.count == arr.count){
                dispatch_semaphore_signal(sema);
            }
        });
    }
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    NSLog(@"done");
    NSLog(@"replaceArray = %@",replaceArray);
    NSLog(@"addedArray = %@",addedArray);
}
image.png

用兩個(gè)數(shù)組是為了顯示 add方法圖片順序問題。
在實(shí)際的上傳圖片網(wǎng)絡(luò)請(qǐng)求中,往往會(huì)有成功&失敗兩個(gè)回調(diào),用上述方法都需要一個(gè)計(jì)數(shù)量判斷,麻煩易出錯(cuò)不說還顯得很不美觀笛辟,于是有了方法3.

方法3:

- (void)groupA{
    
    NSLog(@"============= groupA =======");
    dispatch_group_t group = dispatch_group_create();
    NSArray *arr = @[@"aaa",@"bbb",@"ccc",@"ddd"];
    //有同時(shí)被寫入數(shù)據(jù)的情況 需要加線程鎖 此處用dispatch_semaphore_t鎖住 以保證數(shù)據(jù)安全
    NSMutableArray *addedArray = [NSMutableArray array];
    dispatch_semaphore_t semaLock = dispatch_semaphore_create(1);
    NSMutableArray *replaceArray = [NSMutableArray arrayWithArray:arr];
    for (int i = 0; i < arr.count; i++) {

        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            dispatch_semaphore_t sema = dispatch_semaphore_create(0);
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
                NSObject *obj = [arr objectAtIndex:i];
                sleep(2);
                NSLog(@"image %@ index %tu has uploaded",obj,i);
                NSString *newObj = [NSString stringWithFormat:@"%@_%tu",obj,i];
                [replaceArray replaceObjectAtIndex:i withObject:newObj];
                dispatch_semaphore_wait(semaLock, DISPATCH_TIME_FOREVER);
                [addedArray addObject:newObj];
                dispatch_semaphore_signal(semaLock);
                dispatch_semaphore_signal(sema);
            });
            dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
        });

    }
    //會(huì)阻礙主線程
   // dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{

    NSLog(@"done");
    NSLog(@"replaceArray = %@",replaceArray);
    NSLog(@"addedArray = %@",addedArray);
});
}

如果是成功失敗回調(diào),則

success{
                dispatch_semaphore_signal(sema);
}failure{
                dispatch_semaphore_signal(sema);
}
image.png

參考資料:iOS之利用GCD信號(hào)量控制并發(fā)網(wǎng)絡(luò)請(qǐng)求

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末序苏,一起剝皮案震驚了整個(gè)濱河市手幢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忱详,老刑警劉巖围来,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異匈睁,居然都是意外死亡监透,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門航唆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胀蛮,“玉大人,你說我怎么就攤上這事糯钙》嗬牵” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵任岸,是天一觀的道長(zhǎng)再榄。 經(jīng)常有香客問我,道長(zhǎng)享潜,這世上最難降的妖魔是什么困鸥? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮剑按,結(jié)果婚禮上疾就,老公的妹妹穿的比我還像新娘。我一直安慰自己吕座,他們只是感情好虐译,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吴趴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锣枝,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天厢拭,我揣著相機(jī)與錄音,去河邊找鬼撇叁。 笑死供鸠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陨闹。 我是一名探鬼主播楞捂,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼趋厉!你這毒婦竟也來了寨闹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤君账,失蹤者是張志新(化名)和其女友劉穎繁堡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乡数,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椭蹄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了净赴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绳矩。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖玖翅,靈堂內(nèi)的尸體忽然破棺而出翼馆,到底是詐尸還是另有隱情,我是刑警寧澤烧栋,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布写妥,位于F島的核電站,受9級(jí)特大地震影響审姓,放射性物質(zhì)發(fā)生泄漏珍特。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一魔吐、第九天 我趴在偏房一處隱蔽的房頂上張望扎筒。 院中可真熱鬧,春花似錦酬姆、人聲如沸嗜桌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)骨宠。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間层亿,已是汗流浹背桦卒。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匿又,地道東北人方灾。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像碌更,于是被迫代替她去往敵國(guó)和親裕偿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理痛单,服務(wù)發(fā)現(xiàn)嘿棘,斷路器,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 從三月份找實(shí)習(xí)到現(xiàn)在桦他,面了一些公司蔫巩,掛了不少,但最終還是拿到小米快压、百度圆仔、阿里、京東蔫劣、新浪坪郭、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,213評(píng)論 11 349
  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 13,700評(píng)論 0 15
  • 莫干山:放開心靈 說走就走的旅行脉幢,在南方生活的半年里歪沃,是我們的常態(tài)。 早聽說莫干山嫌松,山上有個(gè)裸心谷沪曙,礙于價(jià)位過高,...
    編生活邊故事閱讀 659評(píng)論 2 1
  • 提筆之前萎羔,祝父親大人生日快樂液走,身體健康。在您生日這天我想寫一封信給你贾陷,雖然不會(huì)給您看缘眶,但我希望你能感受得到。 ...
    梨白糖閱讀 243評(píng)論 0 0