2 u010545480 u010545480 于 2017.09.04 17:36 提问

iOS OSS如何批量上传多张高质量图片???求大神指导 100C

业务描述:一款摄影师app, 需要上传大量的图片到OSS上面,将10M-20M的原片压缩到1-2M之后,然后一次性选择500张1-2M的图片上传到OSS上面。

问题描述: 选择了大量高质量图片之后,会导致内存瞬间暴增,最终导致APP闪退。

解决思路:从相册选取照片的时候,将10-20M的图片压缩到100KB左右的照片,显示在collectionView上面,因为这样选择的是缩略图,所以不会导致内存暴增,可以将几百张图片顺利展示在collectionView上。
然后,在图片上传的时候,将10M-20M的原片压缩到1-2M之后上传,上传了4-5张图片之后,就会出现app闪退,后面找出原因是因为 [putTask waitUntilFinished] 阻塞了线程,如果注释掉这句代码可以将几百上图片上传,但是中途会导致某些照片实际上面没有上传。

问题追加:

去掉putTask waitUntilFinished] 不行,会导致大量的图片上传不成功。
我反复测试发现,这个问题的根源在于内存里面加载了大量的高质量图片,导致占用的内存暴增,最终会因为内存不够,导致app闪退。
我感觉解决的办法应该是要释放一些内存,占内存的是图片,但是又不得不加载这些图片,而且还要保证图片的质量。

求大神指导,当图片占用了大量内存?如何解决?

已经尝试过@autoreleasepool,对于数量在300张以下有效果,当图片数量达到500张以下,依然会内存暴增。


- (void)thread1GetData:(NSArray *)array
{
    PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
    options.synchronous = YES;

    for (int i = 0; i <[array count]; i ++) {

        @autoreleasepool{
            PHAsset *asset = array[i];

            NSString *imgName = [asset valueForKey:@"filename"];
            NSLog(@"filename:%@",imgName);

            CGSize size = CGSizeMake(asset.pixelWidth, asset.pixelHeight);
            // 从asset中获得图片
            [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {

                UIImage *resultImg = [result scaledCopyOfSizeMin:CGSizeMake(1300, 1300)]; //压缩图片

                [self.dataArr addObject:resultImg];

                result = nil;
                info = nil;
            }];
        }

    }
}

5个回答

devmiao
devmiao   Ds   Rxr 2017.09.04 23:51
devmiao
devmiao   Ds   Rxr 2017.10.06 23:57
devmiao
devmiao   Ds   Rxr 2017.10.06 23:57
zy841958835
zy841958835   Ds   Rxr 2017.09.05 13:28

调用[putTask waitUntilFinished] 这个是使上传变成单线程串型,建议去掉,
至于中途某些没有上传可能是中途网络堵塞 导致请求超时
提供两种方式:
1.每张上传的时候设置自动重传 比如没有上传成功自动重传一次
2.没有上传成功的标注出来 提醒用户 让用户自己再重传

谢谢

u010545480
u010545480   2017.09.05 15:51

去掉putTask waitUntilFinished] 不行,会导致大量的图片上传不成功。
我反复测试发现,这个问题的根源在于内存里面加载了大量的高质量图片,导致占用的内存暴增,最终会因为内存不够,导致app闪退。
我感觉解决的办法应该是要释放一些内存,占内存的是图片,但是又不得不加载这些图片,而且还要保证图片的质量。

Csdn user default icon
上传中...
上传图片
插入图片