u010545480
Robert火山
2017-09-04 09:36

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

100
  • ios

业务描述:一款摄影师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;
            }];
        }

    }
}

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

6条回答