核心数据与iClouddevise

我在iOS 7上,并希望与iCloud使用核心数据,这是行之有效的,我想要的一些input的问题是以下。

我的一些Core Data对象具有相关的图像/大文本文件,我将这些文件作为文件存储在文件系统中,并将这些项目的url设置为string属性。 现在很明显,这不会只与iCloud核心数据同步,因为iCloud没有这些文件的概念。 我想知道你是否对如何处理这个问题有什么build议?

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

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

3)其他一些解决scheme。

有什么build议么?

问候

丹尼尔

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

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

在模型编辑器UI中也有相应的属性checkbox。

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

将文件放在您的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]; } 

所以你可以继续使用当前的策略,将它们转储到文件系统中,并使用string引用。 iCloud会保持同步。

这个解决scheme的适用性取决于这些大块是一次写入多次读取对象(非常适合)还是读写 – 通常是一种types的对象(更复杂)。

一个好处是,对于文本对象,如txtjson如果你保留扩展名的文件iCloud应该“只是工作”,以保持多个设备的编辑同步。

原始数据对象,如jpgpdf将是最后编辑胜利。