iOS 七牛云 利用隊列組 上傳多張圖片

七牛云每上傳一張圖片都要從服務(wù)端請求token,和key不能像阿里云那樣在客戶端sdk中設(shè)置路徑。如果要上傳多張圖片,就要多次網(wǎng)絡(luò)請求,得到token后再上傳。如果我要多張圖片全部上傳完再做某個操作,就會很麻煩。

解決思路:
//創(chuàng)建隊列組
dispatch_group_t group = dispatch_group_create();
//創(chuàng)建隊列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//隊列中添加任務(wù)
dispatch_group_async(group, queue, ^{
});
//隊列組結(jié)束通知
dispatch_group_notify(_group, dispatch_get_main_queue(), ^{
};

基本思路就是創(chuàng)建一個隊列組、一個隊列,然后循環(huán)添加上傳任務(wù)到隊列組中的隊列中去,然后全部結(jié)束后在隊列組的通知回調(diào)中去操作接下來的任務(wù)。

重點:

通知group,下面的任務(wù)馬上要放到group中執(zhí)行了

dispatch_group_enter

通知group,任務(wù)完成了,該任務(wù)要從group中移除了

dispatch_group_leave:

dispatch_group_async(group, queue, ^{
  //在這個方法中,如果執(zhí)行異步任務(wù),比如用網(wǎng)絡(luò)請求,執(zhí)行請求后就算走完了,不會等請求回調(diào)完成
  //這樣結(jié)束通知dispatch_group_notify就不準確了
});

因此我們就要用到上面那兩個方法了,正確的做法是:

dispatch_group_t group = dispatch_group_create();
//創(chuàng)建隊列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
for (int i = 0; i < images.count; i++) {
    dispatch_group_async(group, queue, ^{
          [self requestToken];
    });
}
- (void)requestToken {
    //在開始的時候標記開始
    dispatch_group_enter(_group);

    [self.manager GET:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //獲取到token 和 key
        [weakSelf uploadWithToken:token key:key];
    }];
}

- (void)uploadWithToken:(NSString *)token key:(NSString *)key {

      if (!_upManager) {
      
      QNConfiguration *config = [QNConfiguration build:^(QNConfigurationBuilder *builder) {
         builder.zone = [QNZone zone1];
      }];
      
      _upManager = [[QNUploadManager alloc] initWithConfiguration:config];
   }
   
   [_upManager putData:imageData key:key token:token complete:^(QNResponseInfo *info, NSString *key, NSDictionary *resp) {
      
      //如果有失敗,取消上傳中的option
      if (_isFailed) {
         
         [uploadOption cancellationSignal];
         
      }
      
      NSLog(@"%@",info);
      
      if (info.ok) {
         //結(jié)束的時候標記結(jié)束
         dispatch_group_leave(group);
      }
      else {
         
         _isFailed = YES;
         
         NSLog(@"upload object failed, error: %@" , info.error);
         //結(jié)束的時候標記結(jié)束
         dispatch_group_leave(group);
         
      }
      
   } option:uploadOption];
}

無論上傳成功還是失敗都要標記結(jié)束,網(wǎng)絡(luò)請求失敗也要標記結(jié)束(也可以當嘗試n次請求后任然失敗后標記),這樣以后我們就可以在

dispatch_group_notify(group, dispatch_get_main_queue(), ^{
};

這個方法中準確的獲取到全部上傳結(jié)束的回調(diào),我們可以在這個方法中做接下來的處理了。上面的代碼都只能算是偽代碼,實際開發(fā)中還要自己完善,以及添加一些邏輯比如上傳失敗,請求token失敗,最多嘗試次數(shù)等處理,主要知道這個流程和思路就可以了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 218.241.181.202 wxhl60 123456 192.168.10.253 wxhl66 wxhl6...
    CYC666閱讀 1,552評論 0 6
  • 1、OC中創(chuàng)建線程的方法是什么?如果指定在主線程中執(zhí)行代碼?如何延時執(zhí)行代碼。【難度系數(shù)★★】 1)創(chuàng)建線程的方法...
    木旁_G閱讀 2,083評論 2 16
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評論 19 139
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,567評論 0 35
  • 多線程、特別是NSOperation 和 GCD 的內(nèi)部原理。運行時機制的原理和運用場景。SDWebImage的原...
    LZM輪回閱讀 2,117評論 0 12

友情鏈接更多精彩內(nèi)容