iOS-AFNetworking3.0上傳大量(1000張)圖片到服務(wù)器

背景:

最近項目要做上傳圖片功能坟奥,圖片必須是高清的述吸,所以不讓壓縮优俘,上傳圖片是大量的曹傀,比如幾百張,這個如果是用afn植阴,將圖片直接for循環(huán)加入到formData里會出現(xiàn)一個問題,臨時變量太多,導(dǎo)致內(nèi)存緊張察净,最后程序奔潰。之前寫過用自動釋放池解決它盼樟,但是還是效果不大氢卡。如果上傳的多的話,內(nèi)存還是受不了晨缴。

解決辦法一適用于圖片少量的如40張圖片

我之前寫的在這译秦,可以看看自動釋放池的方法,如果你上傳圖片的數(shù)量不多的話击碗,可以用這種方法筑悴。也很簡單的。鏈接在這里http://www.reibang.com/p/9e84fe63d5c0

解決辦法二適用于圖片大量的如1000張圖片

思考稍途,為甚內(nèi)存會占用那么多呢阁吝?就是因為圖片一口氣讀到內(nèi)存中了。如果咱們上傳三五張圖片械拍,肯定不會出問題突勇。如何把1000張圖片分開傳呢?所以必須要用到多線程的知識坷虑。創(chuàng)建個隊列甲馋。然后挨個傳。注意不要把文件存到隊列里迄损,只要先存一個文件名定躏,執(zhí)行的時候再去讀取文件的內(nèi)容。如果要是將image傳給隊列芹敌,內(nèi)存還是會爆的痊远。所以存?zhèn)€圖片名字。一個字符串肯定沒有image占用的內(nèi)存大吧党窜。上代碼吧拗引。我的圖片來源于相冊,所以我用的圖片id幌衣。

/**
 創(chuàng)建隊列然后開始上傳圖片

 @param LocalIdArray 獲取相冊的圖片id數(shù)組矾削,如果你是本地的就傳遞圖片名字?jǐn)?shù)組壤玫,或者是沙盒的文件名字?jǐn)?shù)組
 */
- (void)uploadOperation:(NSArray *)LocalIdArray
{
    
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    self.queue = queue;
    //這個就是控制同時上傳幾張圖片的,如果是1的話就是串行隊列了哼凯。我是4欲间,是并行隊列。
    queue.maxConcurrentOperationCount = 4;
    
    
    for (int i = 0; i<LocalIdArray.count; i++)
    {
        //加上自動釋放池断部,及時的釋放臨時變量猎贴,防止內(nèi)存奔潰
        @autoreleasepool {
            
            NSString *imageName = [NSString stringWithFormat:@"up_%d.jpg",i];
            
            WS(weakSelf)
            //創(chuàng)建一個任務(wù)
            NSBlockOperation *uploadOperation = [NSBlockOperation blockOperationWithBlock:^{
                
                [weakSelf uploadTaskWithLocalId:LocalIdArray[i] imageount:LocalIdArray.count imageName:imageName];
            }];
            //將任務(wù)加入到隊列中
            [queue addOperation:uploadOperation];
        }
        
    }
    
    
}


/**
 開始上傳單張圖片

 @param LocalId 圖片的id
 @param count 一共上傳多少張圖片
 @param imageName 圖片的名稱
 */
- (void)uploadTaskWithLocalId:(NSString *)LocalId imageount:(NSInteger)count imageName:(NSString *)imageName
{
    
    //通過圖片的id轉(zhuǎn)化為image,如果是圖片名字或者是沙盒圖片文件名字那更簡單了。
    CustomAlbumTool *customAlbumTool = [CustomAlbumTool sharedCustomAlbumTool];
    PHFetchResult<PHAsset *> *upAssetArr = [PHAsset fetchAssetsWithLocalIdentifiers:@[LocalId] options:nil];
    PHAsset *asset = [upAssetArr firstObject];
    UIImage *image = [customAlbumTool getImageWithAsset:asset targetSize:PHImageManagerMaximumSize];
    
    //afn上傳的參數(shù)
    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    dic[@"xxx"] = [UserDataCenter xxx];
    dic[@"xxx"] = self.xxx;
    
    //因為afn上傳是異步執(zhí)行的所以創(chuàng)建一個信號量蝴光。就是為了讓一個任務(wù)完全的執(zhí)行完畢后才執(zhí)行下一個任務(wù)她渴。加信號量就是為了把afn異步轉(zhuǎn)化為同步。如果不轉(zhuǎn)化的話蔑祟。queue.maxConcurrentOperationCount = 1趁耗,也沒辦法做到隊列內(nèi)同步。
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    
    
    WS(weakSelf)
    [SWAYNetWorking uploadWithUrl:uploadModelUrl parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        
        NSData *data = UIImageJPEGRepresentation(image, 1.0);
        [formData appendPartWithFileData:data name:@"file" fileName:imageName mimeType:@"image/jpeg"];
        
    } withProgress:^(NSProgress *uploadProgress) {
        
    } success:^(id responseObject) {
        
        //圖片成功了讓信號量加1
        dispatch_semaphore_signal(semaphore);
        
    } failure:^(NSError *error) {
        
        //圖片傳失敗了讓信號量加1
        dispatch_semaphore_signal(semaphore);
        
    }];
    
    //信號量等待疆虚。DISPATCH_TIME_FOREVER 永遠(yuǎn)等到吧苛败。
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
    
}

監(jiān)聽全部成功刷新ui,可以定義個int型變量径簿,上傳成功一張圖片加1罢屈。如果等于總的圖片數(shù)量就相當(dāng)于上傳完成了,那么就刷新UI吧篇亭。也可以創(chuàng)建個上傳成功刷新UI的任務(wù)缠捌。添加依賴。在任務(wù)里執(zhí)行刷新UI暗赶。

/**
 創(chuàng)建隊列然后開始上傳圖片

 @param LocalIdArray 獲取相冊的圖片id數(shù)組鄙币,如果你是本地的就傳遞圖片名字?jǐn)?shù)組,或者是沙盒的文件名字?jǐn)?shù)組
 */
- (void)uploadOperation:(NSArray *)LocalIdArray
{

    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    self.queue = queue;
    //這個就是控制同時上傳幾張圖片的蹂随,如果是1的話就是串行隊列了十嘿。我是4,是并行隊列岳锁。
    queue.maxConcurrentOperationCount = 4;

    NSBlockOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{ // 回到主線程執(zhí)行绩衷,方便更新 UI 等
          
        }];
    }];

    for (int i = 0; i<LocalIdArray.count; i++)
    {
        //加上自動釋放池,及時的釋放臨時變量激率,防止內(nèi)存奔潰
        @autoreleasepool {

            NSString *imageName = [NSString stringWithFormat:@"up_%d.jpg",i];

            WS(weakSelf)
            //創(chuàng)建一個任務(wù)
            NSBlockOperation *uploadOperation = [NSBlockOperation blockOperationWithBlock:^{

                [weakSelf uploadTaskWithLocalId:LocalIdArray[i] imageount:LocalIdArray.count imageName:imageName];
            }];
           //添加依賴咳燕。
            [completionOperation addDependency:uploadOperation];
            //將任務(wù)加入到隊列中
            [queue addOperation:uploadOperation];
        }

    }
     //將刷新UI的任務(wù)加入隊列,當(dāng)所有的上傳任務(wù)結(jié)束才會調(diào)用completionOperation乒躺。
     [queue addOperation:completionOperation];


}

如果要是你的業(yè)務(wù)是不能讓一張圖片傳遞失敗招盲,那么當(dāng)有一張圖沒有傳成功的話就直接取消所有任務(wù)就行了。

[weakSelf.queue cancelAllOperations];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘉冒,一起剝皮案震驚了整個濱河市曹货,隨后出現(xiàn)的幾起案子咆繁,更是在濱河造成了極大的恐慌,老刑警劉巖顶籽,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玩般,死亡現(xiàn)場離奇詭異,居然都是意外死亡礼饱,警方通過查閱死者的電腦和手機坏为,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镊绪,“玉大人匀伏,你說我怎么就攤上這事×海” “怎么了帘撰?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵跑慕,是天一觀的道長万皿。 經(jīng)常有香客問我,道長核行,這世上最難降的妖魔是什么牢硅? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮芝雪,結(jié)果婚禮上减余,老公的妹妹穿的比我還像新娘。我一直安慰自己惩系,他們只是感情好位岔,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堡牡,像睡著了一般抒抬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晤柄,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天擦剑,我揣著相機與錄音,去河邊找鬼芥颈。 笑死惠勒,一個胖子當(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
  • 正文 獨居荒郊野嶺守林人離奇死亡骑素,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年炫乓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片献丑。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡末捣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出创橄,到底是詐尸還是另有隱情箩做,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布妥畏,位于F島的核電站邦邦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏醉蚁。R本人自食惡果不足惜燃辖,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望网棍。 院中可真熱鬧黔龟,春花似錦、人聲如沸滥玷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惑畴。三九已至蛋欣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桨菜,已是汗流浹背豁状。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留倒得,地道東北人泻红。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像霞掺,于是被迫代替她去往敵國和親谊路。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,133評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫菩彬、插件缠劝、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • Android UI Libs之AndroidSwipeLayout 1. 說明 AndroidSwipeLayo...
    lavor閱讀 10,543評論 1 24
  • 一段在尼泊爾當(dāng)一個月老師的經(jīng)歷潮梯。 之前在尼泊爾某山麓地區(qū)體驗了一個月教師工作。私立英語寄宿學(xué)校惨恭,英文教材秉馏,除個別老...
    前進(jìn)吧有貓閱讀 455評論 0 0
  • 見信安。 寒假獨自留杭之前脱羡,我曾一遍遍自我崩潰:除夕夜的晚上萝究,獨自坐在窗前看一街燈火,面前堆著啤酒和零食锉罐。手邊的手...
    汶汶落落閱讀 250評論 0 2