iOS多圖批量順序上傳

這幾天遇到一個(gè)bug沿量,相冊選擇圖片然后上傳伶选,最后回來的順序并不是你選擇圖片時(shí)的順序,于是想到了 在本地區(qū)處理這個(gè)東西干像。 當(dāng)然在這個(gè)問題解決后蛙埂,發(fā)現(xiàn)還有很多可供參考的解決辦法倦畅,比如:PromiseKit、NSOperationQueue绣的、以及AFNetworking 2中的batch request 也都可以解決這個(gè)問題叠赐。

-(void)pickMediaFromAlbum{
    //TODO
    __block  PRImagePickerVc *vc = [PRImagePickerVc new];
    vc.pickMode = kPickType_ImageOrVideo;
    PDNavigationController *pvc = [[PDNavigationController alloc] initWithRootViewController:vc];
    [self presentViewController:pvc animated:YES completion:nil];
    __weak PRImagePickerVc *weakVc = vc;
    __weak PRGroupChatVc *ws = self;
    [vc setDidFinishPickingPhotosHandle:^(NSArray<UIImage *> *photos, NSArray *assets, BOOL isSelectOriginalPhoto) {
        [weakVc dismissViewControllerAnimated:YES completion:nil];
        
        [photos enumerateObjectsUsingBlock:^(UIImage * _Nonnull image, NSUInteger idx, BOOL * _Nonnull stop) {
            
            @autoreleasepool{
                
                NSMutableDictionary *dict = [NSMutableDictionary dictionary];
                NSString *path = [PDCommonUtil getPathByCompressImage:image ext:nil];
                [dict setObject:[PDCommonUtil dictFromDimensions:image.size] forKey:path];
                //單張上傳
                [ws sendSingleFile:path dimensions:dict];
            }
        }];
        
    }]; 
}
// ********************* 發(fā)送單張圖片 begin *********************

-(void)sendSingleFile:(NSString *)imageUrl dimensions:(NSDictionary *)dimensionDict{
    
    if (imageUrl.length == 0) {
        return;
    }
    //本地增加一個(gè)localID 
    NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithDictionary:@{@"localID" : @([UMSCloud getMessageID])}];
    
    UMSMessageObject *msgo = [[UMSMessageObject alloc] initMessageWith:@"" peerID:_folderID.targetID.peerID attributes:attributes attachments:nil];
    //發(fā)送單張圖片
    [self sendSinglePicMsg:msgo path:imageUrl dimes:dimensionDict];
    
}

-(void)sendSinglePicMsg:(UMSMessageObject *)msgo path:(NSString *)filepath dimes:(NSDictionary *)dimesdict{
    
    _bForceScrollToBottom = YES;
    
    NSMutableArray *attachinfo = [NSMutableArray array];
    
    BOOL ret = [[PDCvsMan shareInstance] saveMsgDraft:msgo at:self.folderID];
    if (!ret) {
        [[PDCvsMan shareInstance] notifySyncDataAdd:msgo folderID:self.folderID];
        return;
    }
    
    __weak PRGroupChatVc *ws = self;
    
    [[PDCvsMan shareInstance] saveAttachsDraft:@[filepath] desc:nil dimens:dimesdict at:msgo.attributes[@"localID"]];
    [msgo ums_setAttachments:@[]];
    
    NSURL *url;
    if ([[filepath lowercaseString] hasPrefix:@"file:"]) {
        url = [NSURL URLWithString:filepath];
    }else{
        url = [NSURL fileURLWithPath:filepath];
    }
    NSString *filePath = url.path;//[obj substringFromIndex:@"file://".length];
    
    NSString *contentType = [PDCommonUtil mimeTypeForExtension:filePath.pathExtension];
    
    NSFileManager *fm = [NSFileManager defaultManager];
    NSDictionary *fileAttr = [fm attributesOfItemAtPath:filePath error:nil];
    UInt64 fsize = [fileAttr fileSize];
    
    SInt64 msgId = [UMSCloud getMessageID];
    
    UMSFileAttachment *fattach = [[UMSFileAttachment alloc] initWithFileUrl:@"" thumb:nil contentType:[UMSCloudContentType valueOf:contentType] fileSize:fsize fname:filePath.lastPathComponent];
    
    NSMutableDictionary *attr = [NSMutableDictionary dictionaryWithDictionary:@{@"fid": @(msgId).description}];
    NSDictionary *dimens = dimesdict[filepath];
    if (dimens) {
        attr[@"dimensions"] = dimens;
    }
    attr[@"localimg"] = [UIImage imageWithContentsOfFile:filePath];
    
    UMSAttachment *attach = [[UMSAttachment alloc] initWith:UMSProtoAttachmentTypeAttachmentTypeFile text:@"" fallback:@"" attributes:attr];
    [attach setAttachmentBody:fattach];
    
    [msgo addAttachments:@[attach.dictValue]];
    //創(chuàng)造一個(gè)信號量 用于將異步的上傳改造成同步的
    if (!semaphore) {
        semaphore = dispatch_semaphore_create(0);
    }
    
    if (!queue) {
        queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL);
    }
    //加一個(gè)這個(gè) 其實(shí)是擔(dān)心內(nèi)存上漲
    @autoreleasepool{
        
        dispatch_async(queue, ^{
            [[UMSCloud shareInstance] uploadFileWithPath:filePath public:YES progress:^(UMSFileProgress *resp) {
                
            } response:^(UMSUploadFileResponse *resp) {
                
                if (!resp.isSuccess) {
                    msgo.sendStates = KMsgSendFail;
                    [[PDCvsMan shareInstance] notifySyncDataUpdate:msgo folderID:ws.folderID];
                    return ;
                }
                //信號加1
                dispatch_semaphore_signal(semaphore);
                
                UMSFileAttachment *fattach = [[UMSFileAttachment alloc] initWithFileUrl:resp.fileUrl thumb:resp.thumbUrl contentType:[UMSCloudContentType valueOf:contentType] fileSize:resp.fileSize fname:filePath.lastPathComponent];
                
                attr[@"localimg"] = @"";
                
                UMSAttachment *attach = [[UMSAttachment alloc] initWith:UMSProtoAttachmentTypeAttachmentTypeFile text:@"" fallback:@"" attributes:attr];
                
                [attach setAttachmentBody:fattach];
                [attachinfo addObject:attach.dictValue];
                
                NSString *path = [PDCommonUtil getDownloadFilePathby:attach];
                
                [[NSFileManager defaultManager] copyItemAtURL:url toURL:[NSURL fileURLWithPath:path] error:nil];
                
                [msgo setRelpyID:@""];
                [msgo ums_setAttachments:attachinfo];
                
                [[PDCvsMan shareInstance] updateMsgsDraft:msgo at:_folderID];
                [[PDCvsMan shareInstance] removeAttachsDraft:msgo.attributes[@"localID"]];
                [[PDCvsMan shareInstance] sendMessage:msgo at:_folderID];
                
                NSURL *url = [NSURL URLWithString:filepath];
                [[NSFileManager defaultManager] removeItemAtURL:url error:nil];
                
            }];
            //信號減1
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
            
        });
        
    }
    
    [[PDCvsMan shareInstance] notifySyncDataAdd:msgo folderID:self.folderID];
    
}

// ********************* 發(fā)送單張圖片 end *********************
網(wǎng)上看到一段對信號量的 解釋 很有意思:

停車場剩余4個(gè)車位,那么即使同時(shí)來了四輛車也能停的下屡江。如果此時(shí)來了五輛車燎悍,那么就有一輛需要等待。

信號量的值就相當(dāng)于剩余車位的數(shù)目盼理,dispatch_semaphore_wait函數(shù)就相當(dāng)于來了一輛車谈山,dispatch_semaphore_signal

就相當(dāng)于走了一輛車。停車位的剩余數(shù)目在初始化的時(shí)候就已經(jīng)指明了(dispatch_semaphore_create(long value))宏怔,

調(diào)用一次dispatch_semaphore_signal奏路,剩余的車位就增加一個(gè);調(diào)用一次dispatch_semaphore_wait剩余車位就減少一個(gè)臊诊;

當(dāng)剩余車位為0時(shí)鸽粉,再來車(即調(diào)用dispatch_semaphore_wait)就只能等待。有可能同時(shí)有幾輛車等待一個(gè)停車位抓艳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末触机,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子玷或,更是在濱河造成了極大的恐慌儡首,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偏友,死亡現(xiàn)場離奇詭異蔬胯,居然都是意外死亡位他,警方通過查閱死者的電腦和手機(jī)氛濒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門鹅髓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窿冯,你說我怎么就攤上這事骗奖。” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵米愿,是天一觀的道長。 經(jīng)常有香客問我鼻吮,道長育苟,這世上最難降的妖魔是什么椎木? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任违柏,我火速辦了婚禮香椎,結(jié)果婚禮上漱竖,老公的妹妹穿的比我還像新娘。我一直安慰自己畜伐,他們只是感情好馍惹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著玛界,像睡著了一般万矾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上慎框,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天良狈,我揣著相機(jī)與錄音,去河邊找鬼笨枯。 笑死薪丁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的馅精。 我是一名探鬼主播严嗜,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼硫嘶!你這毒婦竟也來了阻问?” 一聲冷哼從身側(cè)響起梧税,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤沦疾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后第队,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哮塞,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年凳谦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忆畅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尸执,死狀恐怖家凯,靈堂內(nèi)的尸體忽然破棺而出缓醋,到底是詐尸還是另有隱情,我是刑警寧澤绊诲,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布送粱,位于F島的核電站,受9級特大地震影響掂之,放射性物質(zhì)發(fā)生泄漏抗俄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一世舰、第九天 我趴在偏房一處隱蔽的房頂上張望动雹。 院中可真熱鬧,春花似錦跟压、人聲如沸胰蝠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姊氓。三九已至,卻和暖如春喷好,著一層夾襖步出監(jiān)牢的瞬間翔横,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工梗搅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留禾唁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓无切,卻偏偏與公主長得像荡短,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子哆键,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

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

  • AFNetworking 在去年年底升級到了 3.0掘托。這個(gè)版本更新想必有很多好處,然而讓我吃驚的是籍嘹,它并沒有 ba...
    戴倉薯閱讀 22,781評論 48 368
  • 上一節(jié)提到為了發(fā)揮長期基金定投持續(xù)攤低成本的優(yōu)點(diǎn)辱士,我們需要源源不斷的現(xiàn)金流(或者叫“閑錢”)泪掀,可生活中時(shí)不時(shí)有花錢...
    厚積爆發(fā)閱讀 335評論 0 1
  • 把生命中最美的年華拿來跟你斗智斗勇,這就是對你最真摯的情誼吶颂碘。 那年异赫,小蕊剛好考上大學(xué),拖著沉重的箱子從南方穿梭到...
    風(fēng)萍浪跡閱讀 71,971評論 0 1
  • 馬先森有張馬臉,喵小姐有張圓臉塔拳,于是鼠证,馬先森姓馬,喵小姐姓毛靠抑。馬先森年歲大了名惩,要回想九遍才可以確定大學(xué)時(shí)代的女朋友...
    397edd6b760c閱讀 272評論 0 1