我正在尝试在使用NSPersistentCloudKitContainer
的CoreData + CloudKit项目中执行历史记录跟踪。我一直在关注苹果的sample project
我想在更新远程存储后执行某些任务。对于此苹果,建议在应用程序的“签名和功能”的“后台模式”部分中启用远程通知。
我已经为我的项目启用了历史跟踪功能,如苹果的示例项目所示。
// turn on persistent history tracking
let description = container.persistentStoreDescriptions.first
description?.setOption(true as NSNumber,
forKey: NSPersistentHistoryTrackingKey)
// ...
我也已经注册了商店以监听商店的变化。
// turn on remote change notifications
let remoteChangeKey = "NSPersistentStoreRemoteChangeNotificationOptionKey"
description?.setOption(true as NSNumber,
forKey: remoteChangeKey)
// ...
也添加了观察者来侦听NSPersistentStoreRemoteChangeNotification
。
但是没有触发NSPersistentStoreRemoteChangeNotification
。为了确保我的实现没有错误,我只是在Apple提供的示例代码的@objc func storeRemoteChange(_ notification: Notification)
中放置了断点,但仍然看不到任何通知被触发并且没有激活断点。
我已经了解了示例项目中对标签进行的重复数据删除,并且还尝试对其进行测试,但没有成功。这是Apple实施中的错误,还是我缺少所需的任何设置?
因此,我已经对OP提到的示例应用程序进行了大量调试,并且观察到以下内容:
NSPersistentStoreRemoteChangeNotificationPostOptionKey
)和通知名称(.NSPersistentStoreRemoteChange
)都有SDK常量,这些都反映在示例代码的最新下载中。 >NSFetchedResultsController
委托,并通过刷新UI处理controllerDidChangeContent
回调。[我的结论是,示例应用程序(可能还有NSPersistentCloudKitContainer
本身的Apple实现)需要使用NSFetchedResultsController
和关联的委托来查找远程生成的本地数据存储更改。
[不幸的是,它看起来不像@FetchRequest
变量注释的SwiftUI机制提供了一种类似的机制来找出何时需要刷新视图。我当前的结论是,在Apple提供与SwiftUI兼容的获取的结果集更新或远程生成的更新的实际通知之前,基于SwiftUI的应用程序中我唯一的选择是找到一种使用NSFetchedResultsController
并委托更新的方法一个SwiftUI视图@State
变量,以便刷新视图。