ios - CoreData fetch() 返回无序的对象

标签 ios swift xcode core-data swift4

我有一个具有名称的实体,出于测试目的,我按照最近添加的 (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")

不知道为什么会发生这种情况,因为我每次都以相同的方式获取数据,并且每次重新启动应用程序时顺序都会恢复正常。我唯一的理论是,当实体属性发生更改时,顺序就会变得困惑,没有任何模式。所以我想知道这个理论是否正确,如果是的话有什么方法可以阻止顺序改变吗?

编辑:我刚刚注意到的一件事是,在它乱序之后,每次当我更改值时,它都会保持这种未排序的顺序

最佳答案

顺序不一定保留在 CoreData 中,但您可以将排序描述符添加到提取请求中,以便以某种方式对其进行排序。如果您希望按添加时间排序,则需要向模型添加时间戳并按时间戳排序。

let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "GraphDataSet")
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
...

关于ios - CoreData fetch() 返回无序的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50748614/

相关文章:

ios - swift - cellForRowAt 从未调用过

ios - 可达性 iOS

ios - swift - viewDidAppear 不会触发

iphone - 如何改变HUD灰色部分的颜色

iOS 在 prepareSegue 之前执行按钮的操作

从xib加载时iOS黑屏

ios - 如何将可拖动对象放置在目标对象的中心

ios - 在Xcode 8.2上构建0字节文件会导致警告 "Mach-O: Reached end of file while looking for: uint32_t."吗?

ios - 核心数据 - 在一对多关系中分配值

ios - scrollToItem 不起作用