Swift中如何向DataSource内SummaryImagesViewModelItem的images属性追加元素
实现方案
- 优先在现有数据源中查找已经存在的
SummaryImagesViewModelItem实例,直接修改它的images属性完成追加,无需重新构造整个数据源 - 如果数据源中不存在对应的图片项(初始化时
summary.images为空没有生成该类型item),可根据需求选择是否新建插入图片项 - 追加完成后可根据业务需要选择全局刷新列表或者局部刷新对应图片区域,性能更优
扩展数据源方法代码
extension ListingSummaryDataSource { /// 向图片项追加新图片 /// - Parameters: /// - newImages: 要追加的新图片数组 /// - needInsertIfNotExist: 不存在图片项时是否自动新建插入,默认true func appendNewImages(_ newImages: [UIImage], needInsertIfNotExist: Bool = true) { // 查找已存在的图片类型item if let imageItem = items.first(where: { $0 is SummaryImagesViewModelItem }) as? SummaryImagesViewModelItem { imageItem.images.append(contentsOf: newImages) return } // 没有找到对应item且允许新建时插入新的图片项 guard needInsertIfNotExist else { return } let newImageItem = SummaryImagesViewModelItem(images: newImages) // 和初始化逻辑保持顺序一致,图片项放在所有item最前面 items.insert(newImageItem, at: 0) } }
调用示例
// 已有数据源实例 let summaryDataSource = ListingSummaryDataSource(summary: currentSummary) // 要追加的图片 let addImages = [UIImage(named: "test1")!, UIImage(named: "test2")!] // 调用追加方法 summaryDataSource.appendNewImages(addImages) // 刷新列表展示最新数据 yourTableView.reloadData() // 可选局部刷新,性能更高 // if let imageSectionIndex = summaryDataSource.items.firstIndex(where: { $0.type == .images }) { // yourTableView.reloadSections(IndexSet(integer: imageSectionIndex), with: .automatic) // }
注意事项
- 现有
SummaryImagesViewModelItem的images属性已经用var声明为可变,不需要修改原有类结构即可直接修改数组内容 - 如果
SummaryViewModelItem协议中定义了type枚举,也可以用$0.type == .images作为查找条件,和类型判断效果一致 - 若业务要求图片项的位置和初始化顺序不同,调整
insert方法的at参数下标即可
内容的提问来源于stack exchange,提问作者David Henry
相关产品推荐
相关产品推荐

