挖坑版图片批量上传被测试测出来了小毛病。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版了。