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

oxcyiej7  于 2023-02-15  发布在  Swift
关注(0)|答案(2)|浏览(139)

我有一个应用程序,使用核心数据与CloudKit。更改是同步在设备之间。
主要目标具有后台模式功能,并选中了“远程通知”。主要目标和小部件目标都具有相同的应用程序组,并且都具有iCloud功能,服务设置为CloudKit,容器中的相同容器已选中。
为了从小部件访问Core Data数据,我使用了CoreDataStack,如下答案所示。在WidgetKit文件中,我有一个函数,它执行获取请求并返回Int-该请求的行数。稍后我在小部件视图中显示该行数。
但是,如果CloudKit中的Core Data数据发生更改,例如,在另一台设备上用户添加或删除了记录,则Int可能不正确。
如何请求更新WidgetKit时间轴条目,当这种变化发生?(如果数据在另一个设备或当前设备上更改。)谢谢。

tzxcd3kk

tzxcd3kk1#

一个可能的解决方案是观察NSPersistentStoreRemoteChange通知。
在您的核心数据堆栈中:

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

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

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

iqih9akk

iqih9akk2#

发生此类更改时,如何请求更新WidgetKit时间轴条目?(如果数据在另一台设备或当前设备上发生更改。
你必须重新加载小部件的时间轴。你可以从主应用目标导入WidgetKit。你可以在保存上下文或处理远程更改时重新加载。
您可以更新所有微件

WidgetCenter.shared.reloadAllTimelines()

或者只选择您需要的小部件

WidgetCenter.shared.reloadTimelines(ofKind: "kind")

有关Apple docs的更多信息

相关问题