GCD多線程之多任務并發(fā)等待所有任務完成

最近做了一個需求虎眨,針對一批數(shù)據(jù),進行網(wǎng)絡請求镶摘,請求結束后嗽桩,根據(jù)返回結果,更新數(shù)據(jù)庫.
這種情況肯定是利用事務,批量更新比較合理凄敢。
同時網(wǎng)絡請求封裝是異步執(zhí)行碌冶,結果在回調(diào)里處理。這個時候GCD就派上用場了涝缝。

Dispatch Group機制這個使用法參照 《編寫高質(zhì)量iOS與OS X代碼的52個有效方法》--第六章 第44條
44.通過Dispatch Group機制扑庞,根據(jù)系統(tǒng)資源狀況來執(zhí)行任務

dispatch group

    NSMutableArray  * realnameOrderInfoModelArray = [[NSMutableArray alloc]init];
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    [self.successPrintInfoArray enumerateObjectsUsingBlock:^(YDOrderInfoModel * orderModel, NSUInteger idx, BOOL * _Nonnull stop) {
        dispatch_group_enter(group);
        dispatch_group_async(group, queue, ^{
            YDRealnameOrderInfoModel * realnameOrderInfoModel = [[YDRealnameOrderInfoModel alloc] initWithOrderInfoModel:orderModel];
            [YDUploadRealNameDataService uploadNewRealNameInfoWithDataArr:@[realnameOrderInfoModel] Success:^(BOOL result) {
                if(result)
                {
                    realnameOrderInfoModel.isUpload = @"1";
                }
                else
                {
                    realnameOrderInfoModel.isUpload = @"-1";
                }
                [realnameOrderInfoModelArray addObject:realnameOrderInfoModel];
                dispatch_group_leave(group);
            } failure:^(NSString *error) {
                [realnameOrderInfoModelArray addObject:realnameOrderInfoModel];
                dispatch_group_leave(group);
            }];
        });
    }];
    dispatch_group_notify(group, dispatch_get_main_queue(), ^(){
        //等數(shù)據(jù)處理完了再進行入庫.
        [[YDOrderTool sharedOrderTool] addNewRealNameOrderDataWithArray:realnameOrderInfoModelArray];
    });

NSOperationQueue

    // 創(chuàng)建隊列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    // 任務1
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        UIImage * image =[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:self.url]]];
        NSLog(@"任務1 完成譬重,線程:%@", [NSThread currentThread]);
    }];
    // 任務2
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        UIImage * image =[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:self.url1]]];
        NSLog(@"任務2 完成,線程:%@", [NSThread currentThread]);
    }];
    // 任務3
    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        UIImage * image =[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:self.url1]]];
        NSLog(@"任務3 完成罐氨,線程:%@", [NSThread currentThread]);
    }];
    // 添加操作依賴臀规,注意不能循環(huán)依賴
    [op1 addDependency:op2];
    [op3 addDependency:op1];

    op3.completionBlock = ^{
        NSLog(@"全部完成,線程:%@", [NSThread currentThread]);
    };
    // 添加操作到隊列
    [queue addOperation:op1];
    [queue addOperation:op2];
    [queue addOperation:op3];

其實操作隊列只是提供了一套高層的OC API栅隐。這里需要需要注意
The receiver is not considered ready to execute until all of its dependent operations have finished executing. If the receiver is already executing its task, adding dependencies has no practical effect. This method may change the isReady and dependencies properties of the receiver. It is a programmer error to create any circular dependencies among a set of operations. Doing so can cause a deadlock among the operations and may freeze your program.
1.循環(huán)依賴項會導致操作之間的死鎖塔嬉。
2.直到接收方的所有相關操作都完成后,才認為接收方已經(jīng)準備好執(zhí)行租悄。如果接收方已經(jīng)在執(zhí)行其任務谨究,那么添加依賴項沒有實際效果
NSOperation和NSOperationQueue相關

dispatch_semaphore

思路有點類似dispatch_group_enter來添加計數(shù)

{
    dispatch_group_t group = dispatch_group_create();
    for(int i = 0 ; i< 10; i ++)
    {
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
            NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:self.url1] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
                dispatch_semaphore_signal(semaphore);
            }];
            [task  resume];
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        });
    }
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    NSLog(@"全部完成,線程:%@", [NSThread currentThread]);
}

其實用dispatch_group_wait 與 dispatch_group_notify來執(zhí)行后面的操作都可以泣棋,但是dispatch_group_notify可以直接將要執(zhí)行的動作傳入塊里胶哲。等dispatch_group執(zhí)行完后 會在執(zhí)行線程執(zhí)行。 加入當前線程不想堵塞潭辈,而開發(fā)者又想在任務結束之后得到通知鸯屿,dispatch_group_notify就更方便了。
iOS GCD之dispatch_semaphore學習

Demo地址

iOS 多任務全部執(zhí)行完后再執(zhí)行操作 —— HERO博客

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末萎胰,一起剝皮案震驚了整個濱河市碾盟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌技竟,老刑警劉巖冰肴,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異榔组,居然都是意外死亡熙尉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門搓扯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來检痰,“玉大人,你說我怎么就攤上這事锨推∏撸” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵换可,是天一觀的道長椎椰。 經(jīng)常有香客問我,道長沾鳄,這世上最難降的妖魔是什么慨飘? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮译荞,結果婚禮上瓤的,老公的妹妹穿的比我還像新娘休弃。我一直安慰自己,他們只是感情好圈膏,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布塔猾。 她就那樣靜靜地躺著,像睡著了一般稽坤。 火紅的嫁衣襯著肌膚如雪桥帆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天慎皱,我揣著相機與錄音,去河邊找鬼叶骨。 笑死茫多,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的忽刽。 我是一名探鬼主播天揖,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼跪帝!你這毒婦竟也來了今膊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤伞剑,失蹤者是張志新(化名)和其女友劉穎斑唬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體黎泣,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡恕刘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抒倚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褐着。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖托呕,靈堂內(nèi)的尸體忽然破棺而出含蓉,到底是詐尸還是另有隱情,我是刑警寧澤项郊,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布馅扣,位于F島的核電站,受9級特大地震影響呆抑,放射性物質(zhì)發(fā)生泄漏岂嗓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一鹊碍、第九天 我趴在偏房一處隱蔽的房頂上張望厌殉。 院中可真熱鬧食绿,春花似錦、人聲如沸公罕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽楼眷。三九已至铲汪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間罐柳,已是汗流浹背掌腰。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留张吉,地道東北人齿梁。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像肮蛹,于是被迫代替她去往敵國和親勺择。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

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