当CloudKit中的核心数据发生变化时,如何更新WidgetKit时间表条目



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

主目标具有背景模式能力;远程通知";。主目标和小部件目标都具有相同的应用程序组,并且都具有iCloud功能,其中Services设置为CloudKit,Containers中的相同容器处于选中状态。

为了从小部件访问核心数据,我使用CoreDataStack,如这个答案所示。在WidgetKit文件中,我有一个函数,它执行提取请求并返回Int——该请求的行数。稍后我会在小部件视图中显示该数字。

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

当发生此类更改时,如何请求更新WidgetKit时间表条目?(如果其他设备或当前设备上的数据发生了更改。(谢谢。

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

在您的核心数据堆栈中:

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

然后你可以检测到这里描述的通知:

  • 如何从通知响应中重新加载iOS 14小工具的时间线

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

当发生此类更改时,如何请求更新WidgetKit时间线条目?(如果其他设备或当前设备上的数据发生更改。(

您必须重新加载小部件的时间线。您可以通过导入WidgetKit从您的主应用程序目标执行此操作。您可以在保存上下文或处理远程更改时执行此操作。

您可以更新所有窗口小部件

WidgetCenter.shared.reloadAllTimelines()

或者只需要的小工具

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

更多关于苹果文档的信息

相关内容

  • 没有找到相关文章

最新更新