我有一个具有名称的实体,出于测试目的,我按照最近添加(0)到最旧添加对象的顺序命名它们。
当我第一次启动应用程序时,它按顺序加载我的实体(0,1,2...),但如果我更改任何实体的名称属性,顺序就会混乱。我使用 numberOfRows tableview 函数来测试它,因为它是在重新加载 tableView 时调用的(如果我错了,请纠正我):
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return 0}
let managedContext = appDelegate.managedObjectContext
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "GraphDataSet")
do {
graphSetArray.removeAll()
graphSetArray = try managedContext.fetch(fetchRequest)
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
for i in 0..<graphSetArray.count{
let set = graphSetArray[(graphSetArray.count-1)-i]
print("Name: ", set.value(forKeyPath: "name") as? String)
}
return graphSetArray.count
}
据我了解,这会清空包含所有实体的数组(尽管我认为这是毫无意义的,因为它在下一行中设置,但我想确保),然后获取填充数组的实体。然后,我向后循环数组(从最近到旧)并获取该索引的实体并打印其名称属性。
这是每次启动应用程序时的控制台输出:
Name: Optional("0")
Name: Optional("1")
Name: Optional("2")
Name: Optional("3")
Name: Optional("4")
Name: Optional("5")
Name: Optional("6")
这是我将实体名称值更改为与原来相同的值之后的结果(只是为了保持顺序,但从技术上讲是更改值并重新加载 tableView):
Name: Optional("5")
Name: Optional("4")
Name: Optional("1")
Name: Optional("3")
Name: Optional("0")
Name: Optional("2")
Name: Optional("6")
不知道为什么会发生这种情况,因为我每次都以相同的方式获取数据,并且每次重新启动应用程序时顺序都会恢复正常。我唯一的理论是,当实体属性发生更改时,顺序就会变得混乱,没有任何模式。所以我想知道这个理论是否正确,如果是的话,有什么方法可以阻止顺序改变吗?
编辑:我刚刚注意到的一件事是,在它乱序之后,每次当我更改值时,它都会保持这种未排序的顺序