gpt4 book ai didi

swift - 如何知道fetchRequest数据已经准备好?

转载 作者:行者123 更新时间:2023-11-30 12:07:24 25 4
gpt4 key购买 nike

我尝试了好几个星期来解决这个问题。

在另一个 View 出现之前,我的数据尚未准备好。

这是我的代码

FirstViewController.swift

let moc = DatabaseController.getContext()

moc.performAndWait {
let fetchRequest:NSFetchRequest<Pet> = Pet.fetchRequest()
fetchRequest.returnsObjectsAsFaults = true
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "order", ascending: false,selector: #selector(NSString.localizedStandardCompare(_:)))]

self.petObj= try! fetchRequest.execute()
}

let VC = self.storyboard!.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
VC.petObj = self.petObj

let navController = UINavigationController(rootViewController: VC)
navController.navigationBar.isHidden = true
self.present(navController, animated:true, completion: nil)

Click here to see my second view result

如上面的结果,你会看到错误和正确的输出

我通过添加解决了问题

sleep(1)

在performAndWait结束之前,但我知道这不是处理这个问题的正确方法。

所以我的调查是获取数据尚未准备好。

最佳答案

使用 fetchedResultsController。 fetchedResultsController 执行提取操作,然后监视核心数据是否有任何更改(更新、删除、插入、移动),以告诉您的 UI 进行更新。一般来说,我喜欢总是使用 fetchedResultsController 而不是只进行 fetch。以下是一些原因:

  1. fetchedResultsController 将使您的 View 与核心数据中的内容保持同步。因此,您很少会显示过时的信息。由于写入核心数据通常是在后台线程完成的,因此这是一个常见问题。
  2. 在删除核心数据对象后访问该对象会导致崩溃。 ManagedObjects 与普通对象不同,强指针不足以保证它们位于内存中。如果从存储中删除实体,则访问该对象将导致崩溃。 FetchedResultsController 会监视删除情况,因此 fetchedObjects 属性始终可以安全访问
  3. 它们既便宜又简单。即使只用于一件元素,也不要害怕使用它们。它们不会占用大量资源。
  4. 它们与 collectionView 和 tableView 配合得很好。它们被设置为具有索引路径来匹配您的 collectionView 或 tableViews。但您不需要使用它们。它们可以与任何 View 匹配。只要确保在代表告诉您时根据需要更新它们即可。

但是有一些问题需要注意:

  1. 如果相关对象发生更改,它们将不会更新。因此,如果您获取特殊类(class) ANY class.special == 1 中的所有 students ,如果类(class)对象更新,它不会更新,因为它只查看学生对象
  2. 正确更新 tableview 或 collectionView 可能很棘手。由于处理移动的方式可能很难正确更新 View 。在这里查看我的答案:App crashes after updating CoreData model that is being displayed in a UITableView

希望有帮助

关于swift - 如何知道fetchRequest数据已经准备好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46508822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com