0

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

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

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

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

4

2 回答 2

0

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

于 2013-02-03T15:31:07.513 回答
0

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

但这无济于事,因为:

  • 即使您检测到 iCloud 可用(我猜NSFileManager是通过它ubiquityIdentityToken或通过调用使用 iCloud URLForUbiquityContainerIdentifier:),您的调用addPersistentStoreWithType:configuration:URL:options:error:可能仍会阻塞一段时间。如果 iCloud 中有可用的新数据,则在您添加持久存储之前它不会开始下载,并且该方法在下载过程完成之前不会返回。有时,iCloud 只是让该方法阻塞一段时间,没有明显的原因。

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

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

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

于 2013-02-04T18:47:34.100 回答