【问题标题】:How to update WidgetKit timeline entries when Core Data data in CloudKit changes?当 CloudKit 中的核心数据数据发生变化时,如何更新 WidgetKit 时间线条目?
【发布时间】:2021-01-06 03:00:14
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ios swift core-data cloudkit widgetkit


    【解决方案1】:

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

    在您的核心数据堆栈中:

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

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


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

    【讨论】:

    • 在没有远程更改通知的情况下也可以这样做吗?例如,当显示小部件的设备上的数据发生更改时?或者在那种情况下仍然会触发远程更改通知?
    • 如果您的数据在设备上(本地)发生更改,它将被推送到云端,然后也会触发远程通知。对于本地 Persistent Container 更改,您可以使用 NSManagedObjectContextObjectsDidChangeNotification。所有这些通知的唯一问题是它们的触发频率可能超出您的预期,因此请明智地使用它们。
    猜你喜欢
    • 2021-03-10
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多