2

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

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

为了从小部件访问 Core Data 数据,我使用 CoreDataStack,如本答案所示。在 WidgetKit 文件中,我有一个执行获取请求并返回的函数Int——来自该请求的行数。稍后我在小部件视图中显示该数字。

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

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

4

1 回答 1

0

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

在您的核心数据堆栈中:

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

然后您可以检测到此处描述的通知:


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

于 2020-09-19T11:28:08.113 回答