【问题标题】:Core Data with iCloud design带有 iCloud 设计的核心数据
【发布时间】:2013-11-20 23:08:38
【问题描述】:

我在 iOS 7 上,想在 iCloud 中使用核心数据,这很好,我想输入的问题如下。

我的一些核心数据对象具有相关的图像/大型文本文件,我将它们作为文件存储在文件系统上,并且只是将这些项目的 url 设置为字符串属性。现在显然这不仅仅适用于 iCloud 核心数据同步,因为 iCloud 没有这些文件的概念。我想知道您是否对如何处理这个问题有任何建议?

1) 我可以将图像数据和大文本文件直接存储为核心数据属性,但这似乎不是最好的方法

2) 我可以使用 iCloud 来存储文档,然后以某种方式尝试在不同 iOS 设备中的文件之间保持同步,但这可能会变得混乱。

3) 其他一些解决方案。

有什么建议吗?

问候

丹尼尔

【问题讨论】:

  • 您是否愿意为此使用任何第三方工具。我有一个朋友在这件事上做得非常出色,并为此提供了服务。
  • 你有这个第 3 方工具信息的链接?
  • 是的……它的作者是@Jiva DeVoe:stackoverflow.com/users/705569/jiva-devoe 称为 Wasabi Sync。
  • 您是否有理由不将它们作为属性存储在核心数据中?我使用可转换属性来存储带有嵌入图像的富文本,其中一些是 8mb jpeg。似乎工作正常,但最大的数据库约为 100mb。以相同的方式分别存储图像和文本同样容易。

标签: ios core-data icloud


【解决方案1】:

如果您以编程方式设置模型,请向setAllowsExternalBinaryDataStorage: 添加一条消息,以允许 Core Data 决定何时将其自动保存为记录或单独的文件。 Core Data 在决定使用外部文件时会为您管理它们,因此它也应该在 iCloud 中“正常工作”。

NSAttributeDescription * imageAttribute;
//Initialise, setup, add to model, etc
[imageAttribute setAttributeType: NSBinaryDataAttributeType];
[imageAttribute setAllowsExternalBinaryDataStorage:YES];

模型编辑器 UI 中的属性也有一个对应的复选框。

https://developer.apple.com/library/ios/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSAttributeDescription_Class/reference.html#//apple_ref/doc/uid/TP30001175-SW26

【讨论】:

  • 那么这是否意味着我将属性值直接设置为图像数据或字符串?
  • 您可以设置该属性来存储图像的 NSData。
  • 在我的测试中,这不适用于 iCloud。除非存储文件存储在 ubiquity 容器中,否则 Core Data 不会同步外部文件,因此永恒文件的子目录也会同步。不确定这是 Core Data 支持的配置。找不到任何说它是的 Apple 文档,但似乎没有任何东西说它不是 - 只是不工作!
【解决方案2】:

将文件也放入您的 iCloud 文档沙箱中,它们将在您的所有设备上保持同步。

您可以使用对项目的相对引用,因为它们将出现在文件系统中的相同相对点。

<ubiquitous container URL>/Documents/something.jpg

一个小问题是同步不是无缝的,如果该项目尚未在设备上,您将必须明确请求从 iCloud 下载。

所以最原始的......

NSDictionary *dict = [urlToIcloudResource resourceValuesForKeys:@[NSURLUbiquitousItemIsDownloadedKey] error:&error];

NSNumber *isDownloaded = dict[NSURLUbiquitousItemIsDownloadedKey];

if (![isDownloaded boolValue]) {
   BOOL res = [[NSFileManager defaultManager] startDownloadingUbiquitousItemAtURL:urlToIcloudResource error:&error];
}

因此,您可以继续使用当前将它们转储到文件系统中的策略,并且只使用对它们的字符串引用。 iCloud 将使它们保持同步。

此解决方案的适用性确实取决于这些大 blob 是一次写入多次读取的对象(非常适合)还是经常读写类型的对象(更棘手)。

一个优点是,对于像txtjson 这样的文本对象,如果您将扩展名保留在文件中,iCloud 应该“正常工作”以保持多个设备编辑同步。

jpgpdf 等原始数据对象将是最后一次编辑获胜。

【讨论】:

  • Fruity Geek 的建议不是更直接吗?为什么你会采用这种方法而不是他建议的方法?
  • 这只是一种不同的方法,可让您完全控制所存储的对象。可能对你有用。或不。 :-)
猜你喜欢
  • 2018-01-08
  • 2013-06-03
  • 2013-12-24
  • 2012-02-03
  • 2012-09-08
  • 1970-01-01
  • 2015-04-09
  • 2016-07-23
  • 1970-01-01
相关资源
最近更新 更多