5

我在 iOS 7 上并想在 iCloud 中使用核心数据,这运行良好,我想要一些输入的问题如下。

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

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

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

3)其他一些解决方案。

有什么建议么?

问候

丹尼尔

4

2 回答 2

5

如果您以编程方式设置模型,请添加一条消息以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

于 2013-11-08T20:12:11.137 回答
3

将文件也放入您的 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 是一次写入多次读取的对象(非常适合)还是经常读写类型的对象(更棘手)。

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

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

于 2013-11-08T20:39:26.247 回答