var done = [Item]()
var list = [Item]()
func loadItems() {
let request: NSFetchRequest<Item> = Item.fetchRequest()
do {
list = try context.fetch(request)
} catch {
print("Error fetching data from context: \(error)")
}
self.tableView.reloadData()
}
func saveItems() {
do {
try context.save()
} catch {
print("Error saving context: \(error)")
}
}
当我将列表中的项目标记为完成时,我试图将其添加到完成列表中并将其从原始列表中删除。但是,saveItems()方法不会将项目保存在完成列表中,并且loadItems方法也不会为完成列表加载项目。
答案 0 :(得分:2)
当我将列表中的项目标记为完成时,我试图将其添加到完成列表中并将其从原始列表中删除。但是,saveItems()方法不会将项目保存在完成列表中,并且loadItems方法也不会为完成列表加载项目。
您可以通过两种方式处理此问题:
为done
设置Item
的属性。然后,您可以保存所有项目而不必担心它们在哪个列表中。您可以通过过滤掉标记为已完成的项目来获取所有项目并创建“待办事项”列表,并通过以下方式创建“完成”列表过滤掉未标记为完成的项目。提取请求可能比“提取所有项目”复杂得多。您可以改为说“获取done
为假的所有项目。”
修复您的代码,以便load
和save
方法确实加载并保存两个列表,并且项目的状态继续取决于其位于哪个列表中。核心数据非常善于跟踪对象之间的关系,因此您可以轻松地拥有一个具有done
和todo
属性的对象,每个属性与Item
有一对多的关系,并将项目标记为完成只是将项目从一组移到另一组的问题。
答案 1 :(得分:0)
补充@Caleb的答案,它告诉您如何解决此问题...
发生这种情况的原因是这些数组未保存在Core Data中。它对它们一无所知,因此无法跟踪对象所在的数组。它了解对象,但不了解数组。每次在代码中执行提取操作时,都会将所有项目放入list
中。但是它仅存在于内存中,并且永远不会保存到Core Data,因此下次您得到的结果相同。