【问题标题】:How iCloud sends a notification to my app when listening NSPersistentStoreDidImportUbiquitousContentChangesNotificationiCloud 在监听 NSPersistentStoreDidImportUbiquitousContentChangesNotification 时如何向我的应用发送通知
【发布时间】:2014-06-23 08:27:37
【问题描述】:

我需要通过 Core Data 将数据保存在 iCloud 和网络服务上。

我想在网络服务上的数据发生变化时通知我的应用程序,就像 iCloud 在 iCloud 上保存的数据发生变化时通知我的应用程序一样。

要处理 iCloud 的通知,我必须在 NSPersistentStoreDidImportUbiquitousContentChangesNotification 上推送一个侦听器,并且我想使用相同的机制来处理对我的 Web 服务上持久化的数据所做的修改。

那么,我想知道 iCloud 如何通知我的应用触发NSPersistentStoreDidImportUbiquitousContentChangesNotification 通知?我怎样才能在我的网络服务和我的应用程序之间做同样的事情?

谢谢!

【问题讨论】:

    标签: ios objective-c core-data synchronization icloud


    【解决方案1】:

    Apple 没有记录整个过程,但目标是您可以像对待 NSManagedObjectContextDidSaveNotification 一样对待 NSPersistentStoreDidImportUbiquitousContentChangesNotification。也就是说,您可以合并来自 iCloud 的更改,就像合并在您的应用中的不同托管对象上下文中所做的更改一样。

    iCloud 通知涉及您无权访问且无法在 iOS 上复制的内容。具体来说,它在 iOS 上使用了一个名为 ubiquity daemon (ubd) 的单独进程。它在您的应用程序之外运行并且独立于它,并负责与 iCloud 服务通信以发送/接收任何新更改。当它收到新的更改时,它会更新您的持久存储文件并通知您的应用程序。由于您无法在 iOS 上运行外部进程,因此即使您知道它是什么,也无法复制确切的流程。

    您能得到的最接近的方法是启动一个单独的线程或队列以尽可能多地复制ubd。该线程将:

    • 从您的网络服务下载新数据
    • 创建新的托管对象上下文并使用此上下文保存新数据
    • 要么稍等片刻然后重复该过程,要么退出并留给您稍后重复。

    保存这些更改后,NSManagedObjectContextDidSaveNotification 将自动发布。您可以使用与处理NSPersistentStoreDidImportUbiquitousContentChangesNotification 或多或少相同的方式来处理它。如果您希望仅在您的应用从 Web 服务接收到新数据时出现通知,您可以在保存这些更改后发布该通知。

    【讨论】:

    • 完美答案,非常感谢!顺便说一句,感谢您博客上的一些精彩文章!
    • 难道这不能通过推送通知来实现吗?
    • 可能。您可以通过多种方式设计流程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多