NSPersistentStoreRemoteChangeNotification没有被触发

问题描述 投票:2回答:1

我正在尝试在使用NSPersistentCloudKitContainer的CoreData + CloudKit项目中执行历史记录跟踪。我一直在关注苹果的sample project

我想在更新远程存储后执行某些任务。对于此苹果,建议在应用程序的“签名和功能”的“后台模式”部分中启用远程通知。

我已经为我的项目启用了历史跟踪功能,如苹果的示例项目所示。

    // turn on persistent history tracking
    let description = container.persistentStoreDescriptions.first
    description?.setOption(true as NSNumber,
                           forKey: NSPersistentHistoryTrackingKey)

    // ...

我也已经注册了商店以监听商店的变化。

    // turn on remote change notifications
    let remoteChangeKey = "NSPersistentStoreRemoteChangeNotificationOptionKey"
    description?.setOption(true as NSNumber,
                               forKey: remoteChangeKey)

    // ...

也添加了观察者来侦听NSPersistentStoreRemoteChangeNotification

但是没有触发NSPersistentStoreRemoteChangeNotification。为了确保我的实现没有错误,我只是在Apple提供的示例代码的@objc func storeRemoteChange(_ notification: Notification)中放置了断点,但仍然看不到任何通知被触发并且没有激活断点。

我已经了解了示例项目中对标签进行的重复数据删除,并且还尝试对其进行测试,但没有成功。这是Apple实施中的错误,还是我缺少所需的任何设置?

core-data cloudkit ios13 nspersistentcloudkitcontainer
1个回答
0
投票

因此,我已经对OP提到的示例应用程序进行了大量调试,并且观察到以下内容:

  • 从XCode版本11.3(11C29)开始,选项键(NSPersistentStoreRemoteChangeNotificationPostOptionKey)和通知名称(.NSPersistentStoreRemoteChange)都有SDK常量,这些都反映在示例代码的最新下载中。 >
  • 尽管示例应用程序实际注册了远程更改通知,但它们从未发送。
  • [所有应用程序界面更新都由应用程序提示,即注册了自己的NSFetchedResultsController委托,并通过刷新UI处理controllerDidChangeContent回调。
  • [我的结论是,示例应用程序(可能还有NSPersistentCloudKitContainer本身的Apple实现)需要使用NSFetchedResultsController和关联的委托来查找远程生成的本地数据存储更改。

[不幸的是,它看起来不像@FetchRequest变量注释的SwiftUI机制提供了一种类似的机制来找出何时需要刷新视图。我当前的结论是,在Apple提供与SwiftUI兼容的获取的结果集更新或远程生成的更新的实际通知之前,基于SwiftUI的应用程序中我唯一的选择是找到一种使用NSFetchedResultsController并委托更新的方法一个SwiftUI视图@State变量,以便刷新视图。

© www.soinside.com 2019 - 2024. All rights reserved.