长沙火山 2017-09-04 09:36 采纳率: 0%
浏览 2958
已结题

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

业务描述:一款摄影师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条回答 默认 最新

  • devmiao 2017-09-04 15:51
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题