CloudKit中的核心数据数据更改时,如何更新WidgetKit时间轴条目?

问题描述

我有一个将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)

然后您可以检测到如下所述的通知:


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