问题描述
我有一个将Core Data与CloudKit结合使用的应用程序。更改在设备之间同步。
主要目标具有后台模式功能,其中选中了“远程通知”。主要目标和小部件目标都具有相同的应用程序组,并且都具有iCloud功能,并且服务设置为CloudKit,并且在选中的容器中具有相同的容器。
为了从窗口小部件访问Core Data数据,我使用CoreDataStack,如this answer所示。在WidgetKit文件中,我有一个执行提取请求并返回Int
的函数-该请求中有许多行。稍后,我在小部件视图中显示该数字。
但是,例如,如果CloudKit中的核心数据数据发生了更改(例如,在另一个设备用户上添加或删除了记录),则Int
可能是错误的。
发生此类更改时,如何请求更新WidgetKit时间轴条目? (如果在另一台设备或当前设备上更改了数据。)谢谢。
解决方法
一种可能的解决方案是观察NSPersistentStoreRemoteChange
通知。
在您的核心数据栈中:
let container = NSPersistentContainer(name: "MyStuff")
let description = container.persistentStoreDescriptions.first
description?.setOption(true as NSNumber,forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)
然后您可以检测到如下所述的通知:
尽管有一个缺点:当检测到远程更改时,此通知会被触发多次(通常是短时间)。为了避免过于频繁地刷新,您可能需要使用计时器来延迟刷新。