我正在构建一个 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
但是,我发现在应用程序停用之前永远不会调用
fetchChanges
。我在日志中看到这一点:
CoreData: debug: CoreData+CloudKit: -[PFCloudKitThrottledNotificationObserver noteRecievedNotification:](40): <PFCloudKitThrottledNotificationObserver: 0x600003fb3fc0>: Got: NSApplicationWillBecomeActiveNotification - 0
我假设正在发生的是,当 CoreData 检测到我的窗口通过
NSApplicationWillBecomeActiveNotification
事件停用时,它会生成一个后台任务来将远程 iCloud
数据获取到本地存储中。
此时,会收到
NSPersistantStoreRemoteChangeNotification
。
我的问题是如何强制本地商店与
iCloud
同步?
非常感谢任何帮助。
一些可能的线索:
我也面临着同样的问题。在我停用并再次激活该应用程序之前,该应用程序不会同步。因此,您的假设是正确的,它取决于
willBecomeActiveNotification
。
要强制同步,您可以运行:
NotificationCenter.default.post(.init(name: NSApplication.willBecomeActiveNotification))
或用它安排一些
Timer
。
当然,这个解决方案并不完美,它实际上是一个解决方法。然而,我花了很多时间试图弄清楚发生了什么,目前我没有看到任何其他解决方案。