iOS-圖片批量上傳-挖坑

背景

注:這個方法有坑劈榨。。【戳--填坑版】
最近一個半路接手的項(xiàng)目需要修改一個功能晦嵌。圖片上傳同辣。項(xiàng)目中有很多地方用到了圖片上傳這個功能拷姿,有的是單張的,有的是批量上傳的『岛現(xiàn)在需要全部改為批量上傳响巢。還有新增圖片上傳的狀態(tài):未上傳、上傳中棒妨、上傳失敗抵乓、上傳成功。上傳失敗需要有一個點(diǎn)擊重傳的功能靶衍。

沒有將代碼抽離出來灾炭,就不放代碼了。涉及具體業(yè)務(wù)的部分為了保密性也不放了颅眶。蜈出。主要就是介紹一下思想,捋一下思路

E003ADF08B70DAB3CB345398206A7403.jpg

動手1

因?yàn)閷e人寫的代碼不太熟悉涛酗,粗略的看過一遍后铡原,決定先改好改的部分。然后在熟悉的過程中看看別人的思路以及牽扯到的需要修改的地方商叹。從結(jié)果往前推燕刻。首先給圖片部分加上顯示的狀態(tài)。找到圖片顯示控件剖笙,新增控件需要的狀態(tài)卵洗。

//上傳中的半透明遮罩
@property (nonatomic, strong) UIImageView *maskView;
//點(diǎn)擊重傳的按鈕
@property (nonatomic, strong) UILabel *reUpload;
//上傳中的轉(zhuǎn)動圖片
@property (nonatomic, strong) UIImageView *uploading;

加號之后我們需要一個變量對這些控件進(jìn)行顯示與隱藏。所以我們要知道這些狀態(tài)弥咪。再來看看現(xiàn)有的這個類中提供了哪些外部更新的方法过蹂。

- (void)setImage:(UIImage *)image;

- (void)setImageUrl:(NSString *)imgUrl;

- (void)clearImage;

其中 imgUrl是上傳成功后接口返回的圖片地址,當(dāng)上傳成功后接口會按上傳順序返回圖片的一串URL聚至,失敗的那張圖片會返回空信息酷勺。拿到結(jié)果后我們會調(diào)用這個方法去刷新。這個時候我們可以拿到 【成功】和【失敗】 的狀態(tài)扳躬。拿另外兩個【未上傳】以及【上傳中】就可以通過

- (void)setImage:(UIImage *)image

這個方法來判斷脆诉。image==nil 未上傳

動手2

接下來是圖片來源的問題。
上傳的圖片通過

  • 拍照
  • 相冊多張選擇
  • 相冊單張選擇(【上傳失敗】需要重傳照片)

主要是修改相冊作為圖片源的部分贷币。讓點(diǎn)擊添加的時候?yàn)槎鄰埢魇ぃ貍鞯臅r候?yàn)橐粡垺E可蟼魇褂昧藙e人開源的控件ZYQAssetPickerController片择,使用懶加載的方式初始化它潜的。

if (_addImgIndex == _imageArray.count) {
    //這個部分是新加的骚揍,_addImgIndex指的是點(diǎn)擊添加圖片的index字管,_imageArray存儲照片的數(shù)組啰挪,用于未上傳時候的展示
    [self presentViewController:self.pickerController animated:YES completion:nil];
 } else {
     UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
     imagePicker.delegate = self;
     imagePicker.allowsEditing = NO;
     imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
     [self presentViewController:imagePicker animated:YES completion:nil];
 }

動手3

照片選擇完成后的回調(diào),包括圖片的顯示嘲叔,圖片的
上傳亡呵。
原先是點(diǎn)一張上傳一張,不存在未上傳時候的顯示問題硫戈。所以我們需要添加一些全局變量來存儲一些東西锰什。

@property (nonatomic, strong) NSMutableArray *imageArray;   //存儲圖片
@property (nonatomic, assign) NSInteger addImgIndex;  //添加照片的index;
@property (nonatomic, assign) NSInteger imageCount;  //與上一個結(jié)合起來

當(dāng)前的controller實(shí)現(xiàn)ZYQAssetPickerControllerDelegate丁逝。開辟一個子線程拿到圖片后汁胆,調(diào)用存儲的方法,將圖片存入內(nèi)存霜幼。mutaFile用來存儲圖片文件用來上傳嫩码。

- (void)assetPickerController:(ZYQAssetPickerController *)picker didFinishPickingAssets:(NSArray *)assets
{
    _isCamera = NO;
    _imageCount = assets.count + _imageArray.count;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSMutableArray *mutaFile = [NSMutableArray new];
        for (int i=0; i<assets.count; i++) {
            ZYQAsset *asset=assets[I];
            [asset setGetFullScreenImage:^(UIImage *result) {
                [self saveImage:result fileArr:mutaFile];
                _addImgIndex += 1;
            }];
        }
    });
}

當(dāng)所有的圖片存儲完畢后我們切回主線程,刷行UI罪既,顯示圖片铸题。并將圖片至于【上傳中】的狀態(tài),調(diào)用上傳文件的方法上傳文件琢感。

- (void)saveImage:(UIImage *)image fileArr:(NSMutableArray<RdAppServiceUploadFile *> *)filePathArr
{
    
   //省略了圖片的壓縮丢间,存儲,以及文件的初始化
    if (!_imageArray) {
        _imageArray = [NSMutableArray array];
    }
    if (_addImgIndex == _imageArray.count) {
        [_imageArray addObject:image];
        [self.viewModel.showImgUrlArr addObject:@"**"];
        [self.viewModel.imgUrlArr addObject:@"**"];
    } else {
        [_imageArray replaceObjectAtIndex:_addImgIndex withObject:image];
        [self.viewModel.showImgUrlArr replaceObjectAtIndex:_addImgIndex withObject:@"**"];
        [self.viewModel.imgUrlArr replaceObjectAtIndex:_addImgIndex withObject:@"**"];
    }
    
    [filePathArr addObject:file];
    if (_isCamera) {
        _isCamera = NO;
        dispatch_async(dispatch_get_main_queue(),^{
            [self.tableView reloadData];
        });
        [self uploadImage:filePathArr];
    }
    else
    {
        
        if (_imageCount == _imageArray.count) {
            dispatch_async(dispatch_get_main_queue(),^{
                [self.tableView reloadData];
            });
            [self uploadImage:filePathArr];
        }
    }
    
}

其中showImgUrlArr和imgUrlArr都是接口返回的驹针,用**代表上傳中烘挫,##代表上傳失敗。在拿到上傳結(jié)果后給他replaceObjectAtIndex柬甥。這樣在用戶點(diǎn)擊下一步的時候墙牌,能彈框告訴用戶圖片的上傳狀態(tài),攔截當(dāng)前頁面的保存操作暗甥。

思考時間做多的地方

當(dāng)圖片分次批量上傳的時候喜滨,怎么處理這個URL對應(yīng)的替換操作。接口并沒有返回當(dāng)前這個URL指向的圖片的下標(biāo)撤防。后來我修改了上傳的文件數(shù)組虽风,原來這個圖片文件數(shù)組是全局變量,保存了所有要顯示的圖片寄月,包括已經(jīng)上傳成功后的圖片辜膝。將它改為當(dāng)前需要上傳圖片,作用域只在相冊及相機(jī)回調(diào) 方法內(nèi)漾肮,然后將文件命名為 0厂抖,1,2...


上傳圖片方法.png

刷新方法里面根據(jù)showImgUrl來判斷展示什么狀態(tài)克懊。

AddImgView *addView = [[AddImgView alloc] init];
       if ([mulArr[i] isEqualToString:@"**"] || [mulArr[i] isEqualToString:@"##"]) {
           //上傳中圖片  + 上傳失敗
           [addView setImage:imageArr[i] reload:[mulArr[i] isEqualToString:@"##"]];
       } else if ([mulArr[i] isEqualToString:@""]) {
       
       } else {
           [addView setImageUrl:imgUrlArr[i]];
       }

總結(jié)

改別人的代碼總覺得很難受忱辅,中間發(fā)生過很多意外的情況七蜘,沒有自己寫的順手。因?yàn)椴磺宄暗木唧w需求墙懂,會忽略掉某些邊界以及特殊情況橡卤。只能自己一次次的debug。不過看別人的代碼學(xué)習(xí)的一種吧损搬”炭猓總不可能每個項(xiàng)目都是從0開始的。巧勤。但是涉及到很多文件的修改真的想吐血啊嵌灰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市颅悉,隨后出現(xiàn)的幾起案子伞鲫,更是在濱河造成了極大的恐慌,老刑警劉巖签舞,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秕脓,死亡現(xiàn)場離奇詭異,居然都是意外死亡儒搭,警方通過查閱死者的電腦和手機(jī)吠架,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搂鲫,“玉大人傍药,你說我怎么就攤上這事』耆裕” “怎么了拐辽?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長擦酌。 經(jīng)常有香客問我俱诸,道長,這世上最難降的妖魔是什么赊舶? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任睁搭,我火速辦了婚禮,結(jié)果婚禮上笼平,老公的妹妹穿的比我還像新娘园骆。我一直安慰自己,他們只是感情好寓调,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布锌唾。 她就那樣靜靜地躺著,像睡著了一般夺英。 火紅的嫁衣襯著肌膚如雪晌涕。 梳的紋絲不亂的頭發(fā)上滋捶,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機(jī)與錄音渐排,去河邊找鬼炬太。 笑死灸蟆,一個胖子當(dāng)著我的面吹牛驯耻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炒考,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼可缚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了斋枢?” 一聲冷哼從身側(cè)響起帘靡,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓤帚,沒想到半個月后描姚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戈次,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年轩勘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怯邪。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绊寻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悬秉,到底是詐尸還是另有隱情澄步,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布和泌,位于F島的核電站村缸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏武氓。R本人自食惡果不足惜王凑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望聋丝。 院中可真熱鬧索烹,春花似錦、人聲如沸弱睦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽况木。三九已至垒拢,卻和暖如春旬迹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背求类。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工奔垦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尸疆。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓椿猎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寿弱。 傳聞我的和親對象是個殘疾皇子犯眠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355