【问题标题】:iCloud with Core Data and File sync具有核心数据和文件同步的 iCloud
【发布时间】:2014-04-10 10:13:37
【问题描述】:

我正在开发一个将 Core Data 与 iCloud 结合使用的应用程序(iOS7 提供了很大的改进)。此应用程序存储数据以使用此信息描述任务:

  • nameNSString
  • dateNSDate
  • image NSString 描述图片的路径

图片可以存储在 Documents 或 Library Directory 中(我必须决定哪个是更方便的文件夹),顺便说一下,在同一个文件夹中,具有唯一的名称。

现在我也想为图像激活 iCloud 同步,否则用户体验将不完整(我只是同步数据库数据。没有图像,应用程序的奇怪/错误行为)。

我对 Apple 文档感到非常困惑。我找不到一种方法来准确了解 iCloud 数据如何满足这种需求。我只想在创建文件夹后立即同步文件夹的每个文件。所以我的问题是:

  • 能否分享一些好的资源来学习如何使用 iCloud 进行文件同步
  • 我必须使用 UIDocument 和其他 iCloud API 吗?还是有“自动”的东西。一个新的再见/愚蠢的问题,我知道:(
  • 在同一个应用程序中使用基于 Core Data 和 Document 的 iCloud 同步是否有任何问题?

注意:我知道我可以通过在文档文件夹中添加文件并希望用户激活文档同步来同步数据……但这显然不是我想要的。

【问题讨论】:

    标签: ios core-data icloud


    【解决方案1】:

    在同一个应用程序中同时使用 Core Data 事务日志同步和基于文件的同步来实现您想要实现的目标非常简单。

    因此,您将设置您的核心数据堆栈以使用 iCloud 选项并通过 iCloud 同步数据更改。同时,您可以将图像存储在 Apps iCloud 容器中,以便它们也可以同步。请记住,您需要在 Core Data 文件 URL 中使用对图像的相对引用,因为完整路径名将根据运行应用程序的设备而有所不同。因此,例如,您只需将图像文件名存储在 Core Data 中,并使用诸如“iCloudContainer/Documents/Images/”之类的标准目录来存储它们。 'iCloudContainer' 是您通过调用 [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:] API 获得的 URL。

    我已上传示例 Core Data 应用程序,这些应用程序使用 iCloud 进行事务日志同步(即同步 Core Data 中的数据),并使用文件同步将 Core Data 备份文件存储在 iCloud 中,然后任何设备都可以访问这些文件。您应该能够使用相同的代码将备份文件移入和移出 iCloud 用于您的图像。请记住,您必须先触发从 iCloud 下载文件,然后才能通过协调读取或使用 NSFileManager 初始化下载来使用它们。

    http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/

    http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/sample-apps-explanations/

    下载并运行示例应用程序,并使用内置的备份文件管理器制作备份文件,并使用不同的设备将它们复制到 iCloud 或从 iCloud 复制。然后在存储图像文件时使用相同的代码。

    您的应用确实必须处理用户更改 iCloud 帐户、登录或退出 iCloud 等事情,并且它们会相应地移动核心数据文件和图像文件。

    【讨论】:

      【解决方案2】:

      让这种情况自动发生的唯一方法是在模型中为图像创建一个二进制数据属性。如果这样做,您可能需要检查允许的外部二进制存储选项,因此照片最终存储为文件而不是数据库中。

      如果您希望将照片存储在商店外部,则需要做更多的工作。您需要自己将照片迁移到 iCloud 容器中,例如使用 NSFileManager 方法。如果你觉得这样更容易的话,你也可以使用像 iCloud Access 这样的类。

      自己处理照片的不利之处在于,当 Core Data 存储同步时,您永远无法确定它们是否已全部到达您的设备,因此可能会丢失一张或多张照片,即使它们有条目在商店。您必须确保您的应用可以处理这种情况,可能会在可以访问真实照片之前显示占位符图像。

      在一个应用程序中使用核心数据和文档同步没有问题。事实上,它们在幕后完全一样。从 iCloud 的角度来看,它们都只是要传输的文件。

      【讨论】:

      • 照片已调整大小并且非常小(小于 200kb)。将它们直接保存到数据库中是个好主意(也许检查外部二进制存储模式)?我的意思是,由于更大的尺寸而不是“正常”数据插入/更新查询,该选项不会造成 iCloud 同步问题吗?
      • 还有一个问题......如果图像通过 setAllowsExternalBinaryDataStorage 存储在外部,您确定 iCloud 会管理它们吗? (顺便说一句,很好的答案!你给了我很多细节)
      • Core Data 的setAllowsExternalBinaryDataStorage 不会将外部文件与 iCloud 同步 - 所以你不能使用它。
      • 嗯?严重地。我很确定这是不正确的。在我的应用程序中使用了几个月,iCloud 正在同步外部二进制文件。你有链接吗?
      • 我在检查 Core Data 外部存储选项时遇到问题。一些文件(也有大约 150 kb 的图像)只是没有同步,我有一个不一致的异常。不是在所有文件上,但它有时会在测试中弹出。将其关闭已解决的问题(只要我测试过),正如我自己发现的那样,这只是正常的解决方案。但我有不到 50 个条目,边缘案例有 1-5 个图像。
      猜你喜欢
      • 2014-03-25
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2018-01-08
      • 2014-03-01
      相关资源
      最近更新 更多