将图像存储到CoreData - Swift

时间:2015-06-05 16:57:28

标签: ios image swift core-data nsdata

在我的代码中,我设法使用CoreData保存textLabel,但我似乎无法正确保存图像。我已经阅读了一些教程,我知道我必须将它转换为NSData。但是我该怎么做呢?

提前致谢!

4 个答案:

答案 0 :(得分:17)

你不应该在核心数据中保存大数据,Apple工程师在上一届WWDC上告诉我这个小技巧:

您可以使用属性"允许外部存储":

enter image description here

据我所知,通过这样做,您的图像将存储在文件系统中的某个位置,并且内部核心数据将保存到文件系统中图片的链接。每当您要求提供图片时,核心数据都会自动从文件系统中检索图像。

要将图像保存为NSData,您可以执行以下操作:

let image = UIImage(named: "YourImage")
let imageData = NSData(data: UIImageJPEGRepresentation(image, 1.0))
managedObject?.setValue(imageData, forKey: "YourKey")

请记住,UIImageJPEGRepresentatio中的1.0表示您使用的是最佳质量,因此图像会变得庞大而沉重:

  

生成的JPEG图像的质量,表示为0.0的值   到1.0。值0.0表示最大压缩(或最低压缩)   质量),而值1.0代表最小压缩(或最佳   质量)。

答案 1 :(得分:5)

核心数据并不意味着保存像图像这样的大型二进制文件。请改用文件系统中的文档目录。

以下是实现此目的的示例代码。

let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String
// self.fileName is whatever the filename that you need to append to base directory here.
let path = documentsDirectory.stringByAppendingPathComponent(self.fileName)
let success = data.writeToFile(path, atomically: true)
if !success { // handle error }

建议将filename部分保存到核心数据以及与该图像关联的其他元数据,并在每次需要时从文件系统中检索。

编辑:还要注意,从ios8开始,持久化的完整文件URL无效,因为沙盒app-id是动态生成的。您需要根据需要动态获取documentsDirectory

答案 2 :(得分:0)

您可以使用UIImagePNGRepresentation来获取JPEG和PNG:

let image = UIImage(named: "YourImage")
let imageData = NSData(data: UIImageJPEGRepresentation(image, 1.0))
managedObject?.setValue(imageData, forKey: "YourKey")

答案 3 :(得分:0)

通常,大型数据对象不存储在数据库或核心数据中。而是将图像保存在Document目录(或子目录)中,并将文件名保存在Core Data中。

获得@Valentin关于如何创建图像数据表示的答案。

使用func writeToFile(_ path: String, atomically atomically: Bool) -> Bool

保存