我有一个将核心数据与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")
更多关于苹果文档的信息