CoreData 在应用程序停用之前不会更新

问题描述 投票:0回答:2

我正在构建一个 Macos CoreData+CloudKit 应用程序。

我首先通过这样做创建我的容器:

let container = NSPersistentCloudKitContainer(name: "TestApp")
let description = container.persistentStoreDescriptions.first
description?.setOption(true as NSNumber,
                       forKey: NSPersistentHistoryTrackingKey)
let remoteChangeKey = "NSPersistentStoreRemoteChangeNotificationOptionKey"
description?.setOption(true as NSNumber,
                           forKey: remoteChangeKey)
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
    if let error = error {
        fatalError("Unresolved error \(error)")
    }
})

我正在注册以通过执行以下操作接收远程更改:

NotificationCenter.default.addObserver(
            self,
            selector: #selector(fetchChanges),
            name: NSNotification.Name(
                rawValue: "NSPersistentStoreRemoteChangeNotification"),
            object: persistentContainer.persistentStoreCoordinator
        )

fetchChanges
中,我只需通过

重新加载我的 UI
  1. 获取数据
  2. 重新加载我的tableView

但是,我发现在应用程序停用之前永远不会调用

fetchChanges
。我在日志中看到这一点:

CoreData: debug: CoreData+CloudKit: -[PFCloudKitThrottledNotificationObserver noteRecievedNotification:](40): <PFCloudKitThrottledNotificationObserver: 0x600003fb3fc0>: Got: NSApplicationWillBecomeActiveNotification - 0

我假设正在发生的是,当 CoreData 检测到我的窗口通过

NSApplicationWillBecomeActiveNotification
事件停用时,它会生成一个后台任务来将远程
iCloud
数据获取到本地存储中。

此时,会收到

NSPersistantStoreRemoteChangeNotification

我的问题是如何强制本地商店与

iCloud
同步?

非常感谢任何帮助。

swift macos core-data cloudkit
2个回答
0
投票

一些可能的线索:

  1. 您需要在目标签名和功能的“后台模式”中激活“后台获取”
  2. 这发生在我身上,因为我需要再次登录 iCloud(我在“设置”中收到了提示,但如果没有,则值得尝试注销并重新登录)

0
投票

我也面临着同样的问题。在我停用并再次激活该应用程序之前,该应用程序不会同步。因此,您的假设是正确的,它取决于

willBecomeActiveNotification

要强制同步,您可以运行:

NotificationCenter.default.post(.init(name: NSApplication.willBecomeActiveNotification))

或用它安排一些

Timer

当然,这个解决方案并不完美,它实际上是一个解决方法。然而,我花了很多时间试图弄清楚发生了什么,目前我没有看到任何其他解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.