ios - 将 QLPreviewController 与 Core Data 结合使用的正确方法

标签 ios core-data qlpreviewcontroller

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

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

最佳答案

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

因此,您必须能够为其提供磁盘上文件的 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;
}

然后,您可以通过实现 previewItemURLpreviewItemTitle 这两个方法,使您的 NSManagedObject 子类符合 QLPreviewItem 协议(protocol).

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

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

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

关于ios - 将 QLPreviewController 与 Core Data 结合使用的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33595193/

相关文章:

ios - 带有查询参数的 Post 对象

ios - 如何从 FacebookLogin 抓取图片

ios - 我是否需要完全废弃我的应用程序才能添加核心数据?

ios - Xcode Core-Data 数据模型检查器中的索引是什么

ios - 在 QLPreviewController 工具栏上放置白色工具栏看起来是灰色的

iphone - 如何禁用除最顶层 View 以外的所有 View 的触摸输入?

ios - UIWebView 委托(delegate)混淆

ios - NSFetchedResultsController 导致延迟 segue

ios - 在 Swift 中在 UIWebView 上方绘制

iOS QLPreviewController 显示 pdf 保存到文件系统