多張圖片上傳服務器

? ? ? ?最近遇到問題就是多張圖片上傳服務器該怎么設置.剛開始想到的第一想法就是創(chuàng)建個串行隊列.吧這個串行隊列放在子線程.循環(huán)去上傳.首先,在這里.我們首先模擬一個網(wǎng)絡請求的方法.

#pragma mark -模擬網(wǎng)絡請求-

- (void)GET:(NSString*)url

parameter:(NSDictionary*)parmeter

success:(void(^)(idrespondObject))success

failure:(void(^)(NSError*error))failure{

NSError*error;

if([parmeter[@"id"]isEqualToString:@"0"]) {

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{

failure(error);

});

}else{

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{

success(@"");

});

}

}

一.下來就來寫第一種想到的串行隊列的想法

1.定個全局標示.來記錄上傳的個數(shù)

@property(nonatomic,assign)NSUIntegerindex;

2.分發(fā)任務,請求

//創(chuàng)建一個串行隊列

dispatch_queue_tqueue =dispatch_queue_create("com.xxx.www",NULL);

//分發(fā)任務,放到子線程中

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

dispatch_apply(_images.count, queue, ^(size_tindex) {

[selfGET:@"url"parameter:@{@"youparmater":@"imageStr",@"id": [NSStringstringWithFormat:@"%u",arc4random() %2]}success:^(idrespondObject) {

//記錄

_index++;

}failure:^(NSError*error) {

_index++;

}];

});

});

這樣寫有很大的局限性,不能準確的記錄是哪張上傳失敗,還有想要一張完了再下一張,就像 qq 發(fā)說說有圖片那樣的進度提示,就不好做了.

接下來就說說我們的第二種方法,第二方法用到遞歸算法,主要的思想就是:遞歸需要有邊界條件智蝠、遞歸前進段和遞歸返回段士八。當邊界條件不滿足時售碳,遞歸前進藏否;當邊界條件滿足時搜囱,遞歸返回.這里感謝我的好友顧夢曉,當時是和他討論這個問題時,才想出的這個解決方法.

二.遞歸算法

1.創(chuàng)建幾個全局標識

//圖片數(shù)據(jù)源

@property(nonatomic,strong)NSMutableArray*images;

//標示的下標

@property(nonatomic,assign)NSUIntegerindex;

//第一種失敗回調(diào)所需存儲失敗數(shù)據(jù)

@property(nonatomic,strong)NSMutableArray*faileIndexs;

2.測試調(diào)用的函數(shù)

- (void)test{

_images= [@[[UIImageimageNamed:@"scenery1.jpg"], [UIImageimageNamed:@"scenery2.jpg"], [UIImageimageNamed:@"scenery3.jpg"], [UIImageimageNamed:@"scenery4.jpg"]]mutableCopy];

_faileIndexs= [NSMutableArrayarray];

//上傳圖片

[selfupdateImage:_images[0]completion:^(NSUIntegerindex,BOOLisSuccess) {

//1.失敗回調(diào)1的情況處理

if(isSuccess) {

if(index ==_images.count) {

NSLog(@"上傳完畢,失敗的張數(shù)為:%@",_faileIndexs);

}

NSLog(@"上傳過程第%lu張成功",index);

}else{

if(index ==_images.count) {

NSLog(@"上傳完畢,失敗的張數(shù)為:%@",_faileIndexs);

}

[_faileIndexsaddObject:@(index)];

NSLog(@"上傳過程第%lu張失敗",index);

}

//2.失敗回調(diào)2的情況處理

/*

if (isSuccess) {

if (index == _images.count) {

//上傳所有圖片的成功

NSLog(@"上傳所有的成功");

}

NSLog(@"上傳過程第%lu張成功",index);

}else{

//上傳圖片失敗

NSLog(@"上傳圖片失敗,止于第%lu張",index);

}

*/

}];

}

3.上傳圖片的遞歸算法函數(shù)

- (void)updateImage:(UIImage*)image completion:(void(^)(NSUIntegerindex,BOOLisSuccess))completion{

//壓縮圖片,看自己的要求壓縮比例設置compressionQuality參數(shù),此參數(shù)最好在2-7之間.太小澤壓縮容易失真,太大占用內(nèi)存太大

NSData*dataImage =UIImageJPEGRepresentation(image,1);

//轉(zhuǎn)換的參數(shù)有四個枚舉,分別為:

// NSDataBase64Encoding64CharacterLineLength = 1UL << 0,將最大行長度設置為64個字符,插入你所指定的那一行

// NSDataBase64Encoding76CharacterLineLength = 1UL << 1,將最大行長度設置為76個字符,插入你所指定的那一行

//以下可以控制結(jié)束行數(shù)的:

// NSDataBase64EncodingEndLineWithCarriageReturn = 1UL << 4,設置最大行長度64個字符,并可以指定在哪行結(jié)束

// NSDataBase64EncodingEndLineWithLineFeed = 1UL << 5,指定最大行長度76個字符麸祷,并指定在哪行結(jié)束

//這個轉(zhuǎn)換可以自行g(shù)oogle base64加密

NSString*imageStr = [dataImagebase64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

[selfGET:@"url"parameter:@{@"youparmater": imageStr,@"id": [NSStringstringWithFormat:@"%u",arc4random() %2]}success:^(idrespondObject) {

//如果上傳成功

_index++;

//回調(diào)

completion(_index,YES);

if(_index==_images.count) {

//全部上傳成功

//清空標示

_index=0;

return;

}

//繼續(xù)下一行張

[selfupdateImage:_images[_index]completion:completion];

}failure:^(NSError*error) {

//先判斷是否是最后一張,如果是,則返回

if(_index==_images.count-1) {

completion(_index+1,NO);

//清空標示

_index=0;

return;

}

//失敗,分兩種情況:

//1.跳過失敗的那張,返回失敗信息,繼續(xù)下張上傳

_index++;

completion(_index,NO);

[selfupdateImage:_images[_index]completion:completion];

//2.直接返回,不在進行接下來的上傳工作

/*

completion(_index + 1, NO);

//清空標示

_index = 0;

return ;

*/

}];

}

備注:

1.這里列舉了兩種處理方法:第一種是:只要是失敗了就直接停止在那張就可以了,提示用戶繼續(xù)或者取消,這是根據(jù)回調(diào)的標識下標就可以處理數(shù)據(jù)源來重試或者取消.第二種方法就是:一張失敗后,回調(diào)記錄,接著下張繼續(xù)上傳.在全部操作完成后再提示用戶失敗的圖片.

2.在上傳圖片的遞歸函數(shù)中,在遞歸調(diào)用 block 的時候切記要將第一次傳進來的 blcok 遞歸傳遞給后一個函數(shù),不然下個函數(shù)的 block 就會被替代.成功或者失敗的回調(diào)在圖片張數(shù)大于1時,永遠不會被回調(diào)了.

3.如果要自己修改需求.一定要寫好邊界條件.遞歸在適當?shù)臅r候返回,不然就會成死循環(huán)了.

4.全局的下標標識,在完成后一定要清零,不然在同個界面再次操作的時候,標示還保留的上次的最大值,再次調(diào)用函數(shù),會拋出異常.數(shù)組越界.

三.保留數(shù)據(jù)的做法.

? ? ?這點筆者并沒有寫,就談談思路,就是保留數(shù)據(jù).當用戶點擊了保存后,應該把數(shù)據(jù)保存到數(shù)據(jù)庫,在上傳服務器,這時候就不會讓提示失敗,我們會始終把數(shù)據(jù)上傳到服務器為止.我看在處理藍牙接受到的數(shù)據(jù)就是這樣處理的,應為該數(shù)據(jù)為不保留性,過了就會沒有了,但是用戶要用這塊數(shù)據(jù),不能丟失用戶的數(shù)據(jù),所以我們應該將此數(shù)據(jù)保留到數(shù)據(jù)庫,上傳服務器成功為止.用戶多張圖片感覺也是這樣,應為這幾張圖片是用戶在自己的相冊精挑細選出來的,用戶想的就是要這圖片.不應該就因為一些原因丟失用戶的數(shù)據(jù).喲感興趣的小伙伴可以試試.

今天就寫到這了.周六早晨就下雨,感覺挺舒服清爽的!

補丁:Demo 地址?2016/8/17

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仅父,一起剝皮案震驚了整個濱河市用含,隨后出現(xiàn)的幾起案子离咐,更是在濱河造成了極大的恐慌谱俭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宵蛀,死亡現(xiàn)場離奇詭異昆著,居然都是意外死亡,警方通過查閱死者的電腦和手機术陶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門凑懂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梧宫,你說我怎么就攤上這事接谨。” “怎么了塘匣?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵疤坝,是天一觀的道長。 經(jīng)常有香客問我馆铁,道長跑揉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任埠巨,我火速辦了婚禮历谍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辣垒。我一直安慰自己望侈,他們只是感情好,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布勋桶。 她就那樣靜靜地躺著脱衙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪例驹。 梳的紋絲不亂的頭發(fā)上捐韩,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音鹃锈,去河邊找鬼荤胁。 笑死,一個胖子當著我的面吹牛屎债,可吹牛的內(nèi)容都是我干的仅政。 我是一名探鬼主播垢油,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼圆丹!你這毒婦竟也來了滩愁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤辫封,失蹤者是張志新(化名)和其女友劉穎惊楼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秸讹,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡檀咙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了璃诀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弧可。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖劣欢,靈堂內(nèi)的尸體忽然破棺而出棕诵,到底是詐尸還是另有隱情,我是刑警寧澤凿将,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布校套,位于F島的核電站,受9級特大地震影響牧抵,放射性物質(zhì)發(fā)生泄漏笛匙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一犀变、第九天 我趴在偏房一處隱蔽的房頂上張望妹孙。 院中可真熱鬧,春花似錦获枝、人聲如沸蠢正。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嚣崭。三九已至,卻和暖如春懦傍,著一層夾襖步出監(jiān)牢的瞬間雹舀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工谎脯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留葱跋,地道東北人持寄。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓源梭,卻偏偏與公主長得像娱俺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子废麻,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

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