【问题标题】:Issue with Core Data fetch request核心数据获取请求问题
【发布时间】:2018-02-11 23:30:11
【问题描述】:

我是 iOS 开发的新手,我在处理核心数据获取请求时遇到了一些问题。我正在使用 Xcode 9-beta 和 swift 4。

每当我更新我的数据库时,我都会使用 fetch 请求加载新数据,以进行一些计算并填充表格视图。

我面临的挑战是,每次我对实体执行获取请求时,我都会得到相同的数据,即使它发生了变化。在我看来,这是在重用来自先前获取请求的数据,因为如果我关闭应用程序并再次打开它,它会向我显示新存储的数据。

这是我的代码:

if let context = container?.viewContext {
        context.perform {

            let request: NSFetchRequest<EntityName> = EntityName.fetchRequest()
            let data = try? context.fetch(request)
            self.data = data!

            self.setUI()
        }
}

我从以下位置获取容器:

let container: NSPersistentContainer? = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer

我给出了一些通用名称,因为我认为这与问题无关。

有什么想法吗?

谢谢, 杰伦

【问题讨论】:

  • 您是否收到任何错误或控制台输出?
  • Fetch 请求永远不会被重用。也许您在更改数据后忘记保存上下文。顺便说一句:持久容器和托管对象上下文应该是非可选的,AppDelegate 是强制性的,否则应用程序将无法启动。强行拆开物品并不是什么坏事:let container = (UIApplication.shared.delegate as! AppDelegate).persistentContainer
  • 我没有在控制台中收到任何错误。每次更改数据时,我都会保存上下文。

标签: ios swift core-data nsfetchrequest


【解决方案1】:

我从容器中获得了 viewContext,因为我需要 UI 线程。我想那是我的问题。我通过传递用于获取和创建数据并将请求分派到主队列的上下文解决了它:

func loadData(with context: NSManagedObjectContext) {

    context.perform {

        DispatchQueue.main.async {
            let request: NSFetchRequest<EntityName> = EntityName.fetchRequest()
            let data = try? context.fetch(request)
            self.data = data!

            self.setUI()
        }
    }
}

希望对你有帮助。

【讨论】:

    【解决方案2】:

    如果您没有收到任何错误。也许是因为更改后您没有保存上下文

    你确定是你做的吗?

    此方法可帮助您在更改后立即保存上下文

      private func saveContext() {
        guard managedObjectContext.hasChanges else {
          return
        }
        do {
          try managedObjectContext.save()
        } catch {
          abort()
        }
      }
    

    尝试在AppDelegate中找到它

    更新:

    也可能是因为.perform是异步的,你更新数据后还没有保存。

    异步执行上下文队列上的块。 封装一个自动释放池和对 processPendingChanges 的调用

    【讨论】:

    • 我确实保存了上下文。另外,我知道它正在工作,因为当我关闭应用程序并再次打开它时,它会显示更新的数据,所以我会说它与获取请求有关。是的,它在 AppDelegate 文件中。
    • 更新UI时,是主线程吗?因为 context.perform 是异步的。如果您更改 smt 并异步保存,则数据可能仍在保存或仍在加载。尝试找到它并调试。
    • 这是主线程,否则我会收到错误消息。另外,我在使用时是真的:Thread.isMainThread
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多