我正在创建一个应用程序,其中数据需要立即显示在本地数据存储区中。当应用程序开始确定iCloud是否可用时,我会关闭后台线程。
我到处寻找并找不到解决方案:当iCloud可用时,我可以更改persistentStore上的“选项”以开始使用iCloud交易吗?
我不确定在这种情况下适当的方法是什么。我尝试的一切都会导致应用程序崩溃。
最初我有它,所以iCloud检查不在后台线程中,应用程序工作正常,但偶尔会超时。
答案 0 :(得分:0)
您无法知道iCloud何时可用。您只需使用数据,但不直接将它们发送到iCloud。 iOS代替你。所以只知道它何时以及如何发送数据。
答案 1 :(得分:0)
不,一旦NSPersistentStore
对象存在,就无法更改它们。您只能在将持久性存储添加到NSPersistentStoreCoordinator
时指定选项。最接近改变选项的方法是拆除整个Core Data堆栈并重新开始使用不同的选项。
但这不会有帮助,因为:
即使你已经检测到iCloud可用(我猜是使用NSFileManager
,可以通过ubiquityIdentityToken
或通过调用URLForUbiquityContainerIdentifier:
)来调用{{ 1}}可能仍会阻塞一段时间。如果iCloud中有新数据,则在添加持久存储之前不会开始下载,并且在下载过程完成之前该方法不会返回。有时候,iCloud只是暂时让这种方法阻塞了一段时间。
如果您在使用非iCloud选项时让用户对数据进行任何更改,则稍后这些更改将不会自动发送到云。当iCloud处于活动状态时,核心数据仅在数据发生变化时向iCloud发送更改 - 这会使其生成事务。您必须加载并重新保存用户所做的任何更改,否则这些更改将永远不会进入云端。
不幸的是,在使用iCloud核心数据时,您遇到了一个主要的绊脚石。在Core Data完成与iCloud的通信之前,您无法使完整数据存储可用 - 因为在此之前您不会返回添加持久存储的调用。你无法做任何事情来加速这个过程。如果您继续尝试将iCloud与Core Data一起使用,这只是您遇到的一个麻烦。
根据您的数据的性质,可能能够使用两个数据存储,一个是纯本地的,一个是通过iCloud同步的。你可以使纯粹的本地数据存储可用,而iCloud试图让它的行为足够好以便有用。如果你坚持使用一个数据存储,那么你就会遇到延迟。