CloudKit 中的 Core Data 数据发生变化时,如何更新 WidgetKit 时间线条目?

How to update WidgetKit timeline entries when Core Data data in CloudKit changes?

我有一个使用 Core Data 和 CloudKit 的应用程序。更改在设备之间同步。

主要目标具有后台模式功能并选中“远程通知”。主要目标和小部件目标都具有相同的应用程序组,并且都具有 iCloud 功能,服务设置为 CloudKit 并选中容器中的相同容器。

为了从小部件访问核心数据数据,我使用 CoreDataStack,如 所示。在 WidgetKit 文件中,我有一个函数可以执行获取请求和 returns Int — 来自该请求的许多行。稍后我在小部件视图中显示该数字。

但是,如果 CloudKit 中的 Core Data 数据发生变化,例如 — 在另一台设备上用户添加或删除了记录,则 Int 可能不正确。

如何在发生此类更改时请求更新 WidgetKit 时间线条目? (如果数据在另一台设备或当前设备上更改。)谢谢。

一个可能的解决方案是观察 NSPersistentStoreRemoteChange 通知。

在您的核心数据堆栈中:

let container = NSPersistentContainer(name: "MyStuff")
let description = container.persistentStoreDescriptions.first
description?.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)

然后您可以像这里描述的那样检测通知:


虽然有一个缺点:当检测到远程更改时,会多次触发此通知(通常是短系列)。为避免刷新过于频繁,您可能需要使用定时器来延迟刷新。