Core Data配合UITableView编辑删除后新增数据顺序混乱问题求助
问题原因
- Core Data 执行 fetch 请求时默认不会返回固定顺序的结果,具体顺序由内部存储结构决定。你未执行编辑、删除操作时,存储结构刚好匹配创建顺序,所以显示正常;执行过增删改操作后内部存储结构变动,没有指定排序规则的情况下就会出现乱序。
createItem方法执行顺序错误:先执行了获取数据的getAllItems(),再保存新创建的条目,导致新数据未被及时写入时就刷新了列表。
修复方案
1. 给 fetch 请求添加排序规则
修改 getAllItems 方法,新增按 createdAt 字段排序的规则,保证每次返回的列表顺序稳定,示例按创建时间正序排列(新创建的在列表底部,需要倒序的话把 ascending 参数改为 false 即可):
func getAllItems(){ do { let request: NSFetchRequest<ToDoListItem> = ToDoListItem.fetchRequest() // 指定按创建时间排序 request.sortDescriptors = [NSSortDescriptor(key: "createdAt", ascending: true)] models = try context.fetch(request) DispatchQueue.main.async { self.tableView.reloadData() } } catch { print(error) } }
2. 修正 createItem 执行顺序
先保存新创建的条目到数据库,再重新拉取数据刷新列表:
func createItem(name: String){ let newItem = ToDoListItem(context: context) newItem.name = name newItem.createdAt = Date() do{ // 先保存上下文,再刷新数据 try context.save() getAllItems() }catch{ print(error) } }
拓展说明
如果后续需要支持用户手动拖拽调整列表顺序,可以给 ToDoListItem 实体新增一个 sortOrder 整数类型字段,每次用户调整顺序后更新对应条目的 sortOrder 值,fetch 时按 sortOrder 字段排序即可实现自定义顺序。
内容的提问来源于stack exchange,提问作者sweta
相关产品推荐
相关产品推荐

