如何将 [String: UIImage] 类型的字典存储到 CoreData/UserDefaults 中?

Posted

技术标签:

【中文标题】如何将 [String: UIImage] 类型的字典存储到 CoreData/UserDefaults 中?【英文标题】:How can I store a Dictionary of type [String: UIImage] into CoreData/UserDefaults? 【发布时间】:2017-02-02 19:34:52 【问题描述】:

我有一个字典 offlineImages = [String: UIImage](),我想将它存储到 CoreData/UserDefaults 中。我该怎么做?最好的选择是什么?

尝试使用文件系统,但图像不会显示(offlineImages 数组包含图像的本地 URL):

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "offlineCell")
    let mainImageView = cell?.viewWithTag(2) as! UIImageView
    let mainImageURL = offlineImages[indexPath.row]
    let mainImageData = NSData(contentsOf: mainImageURL)
    let mainImage = UIImage(data: mainImageData! as Data)
    mainImageView.image = mainImage
    return cell!

【问题讨论】:

不要。将图像写入文件系统。并且永远不要将那么多数据写入 NSUserDefaults。它适用于少量数据。 @rmaddy,如何将其存储到 CoreData 中? 你没有。将图像写入文件系统。只需将文件名存储在核心数据中。 我试过了,但尝试通过其本地 URL 显示图像没有任何效果。 除非您使用相关代码和有关您尝试的具体细节更新您的问题,否则没有人可以提供帮助。 【参考方案1】:

在 .xcdatamodeld 文件中为您的字典创建属性,类型为 Transformable。然后在生成的实体子类中将类型从 id 更改为 Dictionary

【讨论】:

对不起,我不明白“生成的 CoreData 子类”是什么意思。 用属性设置实体后,您需要为它们生成子类。这是你做的吗? 还没有。我不完全知道如何使用 CoreData。我看过一个教程,但它只适用于字符串。【参考方案2】:

您可以像这样将 Image 转换为 NSData 并存储到 CoreData(二进制数据)中

 NSData *imageData = UIImagePNGRepresentation(image);

 [selectedObject setValue:imageData forKey:@"imageEntity"]; // selectedObject refers to NSManagedObject

并获取图片

NSManagedObject *selectedObj = [[self fetchedResultsController] objectAtIndexPath:indexPath];
UIImage *image = [UIImage imageWithData:[selectedObject valueForKey:@"image"]];
[self.imageView setImage:image]

【讨论】:

以上是关于如何将 [String: UIImage] 类型的字典存储到 CoreData/UserDefaults 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UIImage(contentsOfFile:String) 与从 Internet 下载的图像数据一起使用?

如何快速将 PFFile 转换为 UIImage?

如何将 JSON Image-String(不是 url)转换为 UIImage 以供查看

NSString转换为UIImage

如何将 UIImage 转换为 NSData 或 CFDataRef?

如何解决此错误:无法将类型“__NSCFString”(0x10354a248)的值转换为“UIImage”(0x104c42b48)