我在iOS 7上想要使用iCloud的核心数据,这很好用,我想要输入的问题如下。
我的一些核心数据对象具有相关图像/大文本文件,我将其作为文件存储在文件系统中,只是将这些项目的URL设置为字符串属性。现在显然这不会与iCloud核心数据同步一起工作,因为iCloud没有这些文件的概念。我想知道你是否有任何关于如何处理这个问题的建议?
1)我可以直接将图像数据和大文本文件存储为核心数据属性,但它似乎不是最佳方式
2)我可以使用iCloud存储文档,然后以某种方式尝试在不同的iOS设备中保持文件之间的同步,但这可能会变得混乱。
3)其他一些解决方案。
任何建议?
此致
丹尼尔
答案 0 :(得分:5)
如果您以编程方式设置模型,请向setAllowsExternalBinaryDataStorage:
添加消息,以允许Core Data自动决定何时将其另存为记录或单独文件。 Core Data在决定使用它们时会为您管理外部文件,因此它也应该在iCloud中“正常工作”。
NSAttributeDescription * imageAttribute;
//Initialise, setup, add to model, etc
[imageAttribute setAttributeType: NSBinaryDataAttributeType];
[imageAttribute setAllowsExternalBinaryDataStorage:YES];
模型编辑器UI中的属性也有相应的复选框。
答案 1 :(得分: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应该“正常工作”以保持多个设备编辑同步。
jpg
或pdf
等原始数据对象将是最后一次编辑获胜。