七牛云每上傳一張圖片都要從服務(wù)端請(qǐng)求token,和key不能像阿里云那樣在客戶端sdk中設(shè)置路徑线欲。如果要上傳多張圖片,就要多次網(wǎng)絡(luò)請(qǐng)求减余,得到token后再上傳不脯。如果我要多張圖片全部上傳完再做某個(gè)操作府怯,就會(huì)很麻煩。
解決思路:
//創(chuàng)建隊(duì)列組
dispatch_group_t group = dispatch_group_create()防楷;
//創(chuàng)建隊(duì)列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//隊(duì)列中添加任務(wù)
dispatch_group_async(group, queue, ^{
})牺丙;
//隊(duì)列組結(jié)束通知
dispatch_group_notify(_group, dispatch_get_main_queue(), ^{
};
基本思路就是創(chuàng)建一個(gè)隊(duì)列組复局、一個(gè)隊(duì)列冲簿,然后循環(huán)添加上傳任務(wù)到隊(duì)列組中的隊(duì)列中去,然后全部結(jié)束后在隊(duì)列組的通知回調(diào)中去操作接下來的任務(wù)亿昏。
重點(diǎn):
通知group峦剔,下面的任務(wù)馬上要放到group中執(zhí)行了
dispatch_group_enter
通知group,任務(wù)完成了角钩,該任務(wù)要從group中移除了
dispatch_group_leave:
dispatch_group_async(group, queue, ^{
//在這個(gè)方法中吝沫,如果執(zhí)行異步任務(wù),比如用網(wǎng)絡(luò)請(qǐng)求递礼,執(zhí)行請(qǐng)求后就算走完了惨险,不會(huì)等請(qǐng)求回調(diào)完成
//這樣結(jié)束通知dispatch_group_notify就不準(zhǔn)確了
});
因此我們就要用到上面那兩個(gè)方法了脊髓,正確的做法是:
dispatch_group_t group = dispatch_group_create()辫愉;
//創(chuàng)建隊(duì)列
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 {
//在開始的時(shí)候標(biāo)記開始
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é)束的時(shí)候標(biāo)記結(jié)束
dispatch_group_leave(group);
}
else {
_isFailed = YES;
NSLog(@"upload object failed, error: %@" , info.error);
//結(jié)束的時(shí)候標(biāo)記結(jié)束
dispatch_group_leave(group);
}
} option:uploadOption];
}
無(wú)論上傳成功還是失敗都要標(biāo)記結(jié)束恭朗,網(wǎng)絡(luò)請(qǐng)求失敗也要標(biāo)記結(jié)束(也可以當(dāng)嘗試n次請(qǐng)求后任然失敗后標(biāo)記),這樣以后我們就可以在
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
}袋哼;
這個(gè)方法中準(zhǔn)確的獲取到全部上傳結(jié)束的回調(diào)冀墨,我們可以在這個(gè)方法中做接下來的處理了闸衫。上面的代碼都只能算是偽代碼涛贯,實(shí)際開發(fā)中還要自己完善,以及添加一些邏輯比如上傳失敗蔚出,請(qǐng)求token失敗弟翘,最多嘗試次數(shù)等處理虫腋,主要知道這個(gè)流程和思路就可以了。