iOS-图片批量上传-填坑

挖坑版图片批量上传被测试测出来了小毛病。emmm,大毛病。上传过程中删除图片,闪退。其实我在自测中是没有任何毛病的。。

原因

在删除的时候,我们调用数组的remove操作,移除了排在index的元素。然后等到上传成功,替换对应数组下标的元素为网络返回的URL时,发生数组越界。
如:

//第一张图片上传成功,其余为待上传。
imageUrl = @ [@"one url",@"**",@"**",@"**",@"**"];

//删除第一张图片
[imageUrl  removeObjectAtIndex:0];

//此时imageUrl为[@"**",@"**",@"**",@"**"]

//这样,当其余四张的图片URL返回, 使用replaceObjectAtIndex:withObject:就会发生数组越界。

纳闷,为什么之前自测没有遇到这个必现的超级bug。主要还是我思虑不周导致的。明明写完梳理过一遍了,竟然没有发现这个问题。失败。。

解决

上传图片后返回URL的时候,取file的下标获取需要替换的index。这一点是不能修改的,所以保存图片的URL数组需要保留被删除图片的位置。我们可以再加一个【%%】代表被删除(保存之前是使用【**】【##】代表上传中,上传失败两种状态)。然后刷新的时候,我们去除掉含有【%%】的元素。
1、在删除图片方法中,我们使用

[self.uploadImageUrlArray replaceObjectAtIndex:urlIndex withObject:@"%%"];
[self.showImageArray replaceObjectAtIndex:urlIndex withObject:@"%%"];

来标记被删除的元素。
2、然后在保存图片的时候,修改一下标记【上传中】状态的部分(因为删除的元素没有被移除掉,只是被标记了,这个时候需要标记回来)。这样就不会出现数组越界了。

    if (_addImageIndex<_imageArray.count) {
        [_imageArray replaceObjectAtIndex:_addImageIndex withObject:image];
    } else {
        [_imageArray addObject:image];
    }
    if (_addImageIndex < self.uploadImageUrlArray.count) {
        [self.uploadImageUrlArray replaceObjectAtIndex:_addImageIndex withObject:@"**"];
        [self.showImageArray replaceObjectAtIndex:_addImageIndex withObject:@"**"];
    } else {
        [self.uploadImageUrlArray addObject:@"**"];
        [self.showImageArray addObject:@"**"];
    }

3、刷新。我们需要重新初始化一个数组来拷贝一份URL数组。因为我们需要执行数组的操作,改变数组的元素。所以不能将 定义的全局变量数组哪去刷新,不然还是会出现越界问题。
NSArray *cellArr = [self.showImageArray copy];
在tableview更新数据源的时候,执行过滤【%%】操作。

NSMutableArray *showImageMutaArr = [[NSMutableArray alloc] initWithArray:showImageArr];
  
    [showImageMutaArr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([obj isEqualToString:@"%%"]) {
            [showImageMutaArr removeObject:obj];
        }
    }];

总结

这回应该是没坑了吧。不然得来一个填坑2.0版了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。