CloudKit中的核心数据发生变化时如何调用WidgetCenter.shared.reloadAllTimelines()?
How to call WidgetCenter.shared.reloadAllTimelines() when Core Data in CloudKit changes?
我有一个使用 Core Data 和 CloudKit 的应用程序。更改在设备之间同步。主要目标具有已选中 Remote notifications
的后台模式功能,已检查 iCloud 功能,已将服务设置为 CloudKit 并检查了容器中的正确容器。
我如何在代码中对记录的更改、删除和添加做出反应?当 CloudKit 中的核心数据更改以更新 iOS 14 主屏幕小部件时,我需要调用 WidgetCenter.shared.reloadAllTimelines()
。
我的目标是让它工作:我 change/add/delete 在 icloud.developer.apple.com 或其他设备上记录,然后 WidgetCenter.shared.reloadAllTimelines()
调用以在小部件中显示正确的数据。应用可能在后台或前台。
来自AppDelegate.swift
:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Register for Remote Notifications
application.registerForRemoteNotifications()
return true
}
此外,注意到输出日志中的消息:
CoreData: debug: CoreData+CloudKit: -[NSCloudKitMirroringDelegate remoteStoreDidChange:]_block_invoke(2138): <NSCloudKitMirroringDelegate: 0x281818d00> - Ignoring remote change notification because the exporter has already caught up to this transaction: 64 / 64 - <NSSQLCore: 0x100b09440> (URL: file:///var/mobile/Containers/Data/Application/F83C68DA-7C36-42CC-926D-7C721C679579/Library/Application%20Support/AppTitle.sqlite)
如果您想订阅 Core Data 远程通知,您可以使用 onReceive
:
struct WidgetEntryView : View {
var entry: Provider.Entry
var body: some View {
Text(entry.date, style: .time)
.onReceive(NotificationCenter.default.publisher(for: .NSPersistentStoreRemoteChange)) { _ in
// make sure you don't call this too often
WidgetCenter.shared.reloadAllTimelines()
}
}
}
请确保您不要过于频繁地调用 reloadAllTimelines()
- 您的小部件可用的更新数量可能有限。
我有一个使用 Core Data 和 CloudKit 的应用程序。更改在设备之间同步。主要目标具有已选中 Remote notifications
的后台模式功能,已检查 iCloud 功能,已将服务设置为 CloudKit 并检查了容器中的正确容器。
我如何在代码中对记录的更改、删除和添加做出反应?当 CloudKit 中的核心数据更改以更新 iOS 14 主屏幕小部件时,我需要调用 WidgetCenter.shared.reloadAllTimelines()
。
我的目标是让它工作:我 change/add/delete 在 icloud.developer.apple.com 或其他设备上记录,然后 WidgetCenter.shared.reloadAllTimelines()
调用以在小部件中显示正确的数据。应用可能在后台或前台。
来自AppDelegate.swift
:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Register for Remote Notifications
application.registerForRemoteNotifications()
return true
}
此外,注意到输出日志中的消息:
CoreData: debug: CoreData+CloudKit: -[NSCloudKitMirroringDelegate remoteStoreDidChange:]_block_invoke(2138): <NSCloudKitMirroringDelegate: 0x281818d00> - Ignoring remote change notification because the exporter has already caught up to this transaction: 64 / 64 - <NSSQLCore: 0x100b09440> (URL: file:///var/mobile/Containers/Data/Application/F83C68DA-7C36-42CC-926D-7C721C679579/Library/Application%20Support/AppTitle.sqlite)
如果您想订阅 Core Data 远程通知,您可以使用 onReceive
:
struct WidgetEntryView : View {
var entry: Provider.Entry
var body: some View {
Text(entry.date, style: .time)
.onReceive(NotificationCenter.default.publisher(for: .NSPersistentStoreRemoteChange)) { _ in
// make sure you don't call this too often
WidgetCenter.shared.reloadAllTimelines()
}
}
}
请确保您不要过于频繁地调用 reloadAllTimelines()
- 您的小部件可用的更新数量可能有限。