正确使用QLPreviewController和Core Data的方法

时间:2015-11-08 14:44:45

标签: ios core-data qlpreviewcontroller

我有CoreData应用程序,它将一些BLOB存储在外部文件中(“允许外部存储”标记)。

文件是图像,PDF,excel文件等。我想用QLPreviewController ti预览它。但它从头开始不支持CoreData。所以,我应该先将文件复制到tmp文件夹。我相信应该有更好的方法来做到这一点。 有没有?

1 个答案:

答案 0 :(得分:1)

根据QLPreviewItem的文档,previewItemURL返回的网址必须是文件网址。

因此,您必须能够为磁盘上的文件提供URL。 Apple没有提供获取外部数据URL的官方方法。此外,"更小"无论如何,文件将作为BLOB存储在SQL数据库中。

两个最可行的选项是在需要时将内容复制到临时文件中,或者自己将文件存储在磁盘上,并在核心数据模型中保留URL(或更好的......唯一标识符)。

我选择第二种方法。

如果将文件存储在包含核心数据存储的目录的子目录中,则只需在数据库中保留UUID即可。然后,即使您要将文件移动到其他位置,也可以识别该文件,并且您不必更改商店中的所有实体。

假设您有一个名为" externalFiles"的目录。与持久存储在同一目录中。

如果您使用了特殊实体,则可以为特定项添加两个简单属性(标识符和标题)。标识符可以是NSUUID的字符串表示形式。

您可能已经想要获取URL ...

- (NSURL*)URL {
    // Separated on multiple lines for readability
    NSString *identifier = [self valueForKey:@"identifier"];
    NSURL *url = self.objectID.persistentStore.URL;
    url = [url URLByDeletingLastPathComponent];
    url = [url URLByAppendingPathComponent:@"externalFiles"];
    url = [url URLByAppendingPathComponent:identifier];
    return url;
}

然后,您可以通过实施两种方法NSManagedObjectQLPreviewItem来使previewItemURL子类符合previewItemTitle协议。

- (NSURL*)previewItemURL {
    return self.URL;
}

- (NSURL*)previewItemTitle {
    return self.title;
}

然后,您可以将核心数据实例传递给QLPreviewControllerDataSource,因为现在可以将它们视为QLPreviewItem