iOS、Core Data 和 iCloud - 切换上下文

Posted

技术标签:

【中文标题】iOS、Core Data 和 iCloud - 切换上下文【英文标题】:iOS, Core Data and iCloud - switching context 【发布时间】:2013-02-03 15:02:23 【问题描述】:

我正在创建一个需要立即从本地数据存储中显示数据的应用。当应用程序开始确定 iCloud 是否可用时,我启动了一个后台线程。

我到处找,找不到解决方案:当 iCloud 可用时,我可以更改persistentStore 上的“选项”以开始使用 iCloud 事务吗?

我不确定在这种情况下正确的方法是什么。我尝试的一切都会导致应用程序崩溃。

最初我有它,所以 iCloud 检查不在后台线程中,应用程序运行良好,但偶尔会超时。

【问题讨论】:

【参考方案1】:

您不必知道 iCloud 何时可用。您只是处理数据,但不会将它们直接发送到 iCloud。 ios 代替你做。所以只有它知道何时以及如何发送数据。

【讨论】:

【参考方案2】:

不,一旦 NSPersistentStore 对象存在,您就无法更改它的选项。您只能在将持久存储添加到 NSPersistentStoreCoordinator 时指定选项。最接近更改选项的方法是拆除整个 Core Data 堆栈并重新开始使用不同的选项。

不过,这无济于事,因为:

1234563尽管。如果 iCloud 中有可用的新数据,则在您添加持久存储之前它不会开始下载,并且该方法在下载过程完成之前不会返回。有时,iCloud 只是无缘无故地阻止该方法一段时间。

如果您让用户在使用非 iCloud 选项时对数据进行任何更改,这些更改将不会在以后自动发送到云端。 Core Data 仅在 iCloud 处于活动状态时数据发生更改时才将更改发送到 iCloud——这会使其生成事务。您必须加载并重新保存用户所做的任何更改,否则这些更改将永远无法进入云端。

不幸的是,在将 Core Data 与 iCloud 结合使用时,您遇到了主要的绊脚石之一。在 Core Data 完成与 iCloud 的通信之前,您无法使完整的数据存储可用——因为您添加持久存储的调用直到那时才会返回。你不能做任何事情来加速这个过程。如果您继续尝试将 iCloud 与 Core Data 一起使用,这只是您会遇到的麻烦之一。

根据数据的性质,您可能可以使用两种数据存储,一种纯本地数据存储,另一种通过 iCloud 同步。您可以使纯本地数据存储可用,而 iCloud 则试图将其行为整合到足以发挥作用的程度。但是,如果您坚持使用一个数据存储,则会遇到延迟。

【讨论】:

以上是关于iOS、Core Data 和 iCloud - 切换上下文的主要内容,如果未能解决你的问题,请参考以下文章

iOS7 Core Data 和 iCloud 作为备份。用户的观点

iOS 7 中的 iCloud、Core Data 和来自 Web 服务的数据

iOS Core Data iCloud 同步 - 可选

使用 iCloud 在多台设备上同步 Core Data

iCloud Core Data 在 Xcode 6 / ios 8 SDK 中运行后不可用

iCloud Core Data iOS 6 到 iOS 7 最初是空的本地后备存储