【问题标题】:Swift: Save and Retrieve UIImage Into CoreDataSwift:将 UIImage 保存并检索到 CoreData
【发布时间】:2018-10-26 06:16:15
【问题描述】:

我想将从 UIImagePickerCollector 获得的 UIImage 保存到 CoreData 属性“img”中,即二进制数据类型。我只是尝试使用以下代码保存。

let sampleimage = profileimg?.image
    var dataImage: Data? = nil
    if let aSampleimage = sampleimage {
        dataImage = aSampleimage.jpegData(compressionQuality: 0.0)
    }

    let imag = Data()

    let newUser = NSEntityDescription.insertNewObject(forEntityName: "Person", into: Constant.context!)

    newUser.setValue(self.txtName!.text, forKey: Constant.CDName)
    newUser.setValue(self.txtEmail!.text, forKey: Constant.CDEmail)
    newUser.setValue(self.txtPassword!.text, forKey: Constant.CDPassword)
    newUser.setValue(yourDate, forKey: Constant.CDDob)
    newUser.setValue(imag, forKey: Constant.CDImage)

当我尝试运行它时没有显示任何错误。但我不知道图像是否保存在 CoreData 中。如何查看?

当我尝试将图像分配到我的表格视图单元格时,它会显示以下错误。请证明正确的解决方案。

【问题讨论】:

  • Binary Data是Data类型,不是UIImage,可以通过UIImage(data:)转成UIImage
  • @Krunal - 你得到的是 NSData 到 UIImage 的转换错误。尝试使用 UIImage(data:imageData,scale:1.0) 假设图像的比例为 1。
  • 能否提供完整代码。谢谢
  • 请参阅答案部分。让我知道这是否适合您

标签: ios swift xcode core-data uiimagepickercontroller


【解决方案1】:

您收到 NSDataUIImage 的转换错误。尝试使用 UIImage(data:imageData,scale:1.0) 假设图像的比例为 1。

对于您的代码,它可能类似于:

if let imgData = obj.img {
    cell.listImg.image = UIImage(data:imgData, scale:1.0) //presuming the image's scale is 1
}

其他变化可能是

if let imgData = obj.img {
    cell.listImg.image = UIImage(data: imgData)
}

保存图像,在声明newUser.setValue(imag, forKey: Constant.CDImage) 中,您使用的是imag,但实际图像包含在dataImage 中。请改正

newUser.setValue(imag, forKey: Constant.CDImage)

newUser.setValue(dataImage, forKey: Constant.CDImage)

对于共享代码,我没有看到let imag = Data() 的任何用途,如果它在您共享的代码部分之外没有被使用,您可以将其删除。

【讨论】:

  • Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value 显示此错误。我认为图像没有正确保存到 CoreData。
  • 使用可选链来避免这个错误。请检查更新的答案。
  • 更新答案中的可选链接在哪里?您了解可选展开和可选链接之间的区别吗?
  • 我的错我的意思是如果让可选展开。谢谢指正。
  • 好的。错误现在消失了,但图像仍然没有显示。您能否检查并告诉我,这是将图像保存到 CoreData 的正确方法吗?
【解决方案2】:

如果要保存图片,可以将字段设置为Binary data,并且必须转换并保存到核心数据

UIImage 转数据

if image != nil{
   let data = UIImagePNGRepresentation(image!)
}

当你获取时

数据到 UIImage

if data != nil{
   let image = UIImage(data:data)
}

所以像这样你必须创建 coredata 实体的对象,然后你必须将字段创建为二进制数据并保存 UIImage 的数据,当你想要获取时,再次需要从数据转换为图像并分配给你的UIImageview。

【讨论】:

  • 太棒了。工作非常正常。如果您真的喜欢,请点击投票按钮。
  • @Ronak - 强制展开图像!如果 imge 为 nil,可能会导致致命错误。这不是使用可选的建议方式。
猜你喜欢
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2021-11-21
  • 1970-01-01
相关资源
最近更新 更多