Swift 3 - 从核心数据中保存和获取图像
Swift 3 - save and fetch image from core data
是的,我知道还有其他类似的问题,但似乎还没有适合我的答案...
我有一个 api 调用 return 是一个 base64 字符串。这个我尝试保存到核心数据然后return作为图片。不过我不知道哪里出了问题,也许你们中的一些聪明人可以帮助我。
这是我从 api 电话接收数据的地方:
let image = data?.base64EncodedString()
saveImageToDB(brandName: imageBrandName, image: image!)
品牌名称只是一个字符串,例如:"Baresso".
我的 saveImageToDB:
func saveImageToDB(brandName: String, image: String) {
let managedContext = getContext()
let entity = NSEntityDescription.entity(forEntityName: "CoffeeShopImage", in: managedContext)!
let CSI = NSManagedObject(entity: entity, insertInto: managedContext)
let image = UIImage(named: image)
//this is the line that appears to be wrong
let imageData = NSData(data: (UIImagePNGRepresentation(image!)?.base64EncodedData())!)
CSI.setValue(imageData, forKey: brandName)
do {
try managedContext.save()
print("saved!")
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
}
我的获取函数:
func getImageFromDB(callback: @escaping (_ image: UIImage)-> ()) {
var imageFromDB: UIImage?
let fetchRequest: NSFetchRequest<NSManagedObject> = NSFetchRequest(entityName: "CoffeeShopImage")
do {
let searchResults = try getContext().fetch(fetchRequest)
for images in searchResults {
let image = images.value(forKey: "Baresso") as! NSData
imageFromDB = UIImage(data: image as Data)!
callback(imageFromDB!)
}
} catch {
print("Error with request: \(error)")
}
}
我的错误日志:
fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb)
看来我没有保存我的图像,这有点道理,但是我不知道我做错了什么?
编辑:
我搞砸了我的类型。修改后的代码如下:
func saveImageToDB(brandName: String, image: NSData) {
let managedContext = getContext()
let entity = NSEntityDescription.entity(forEntityName: "CoffeeShopImage", in: managedContext)!
let CSI = NSManagedObject(entity: entity, insertInto: managedContext)
CSI.setValue(image, forKey: "image")
CSI.setValue(brandName, forKey: "brandName")
do {
try managedContext.save()
print("saved!")
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
}
你的类型全乱了。
您从 data
开始,我假设它是数据并将其转换为名为 image
的字符串。然后在 saveImageToDB
中,您将字符串 image
视为 UIImage
并尝试首先使用 UIImagePNGRepresentation
将其转换为数据(这将失败,因为它是一个字符串)然后您尝试将该数据转换为字符串,然后尝试将该字符串转换回同样错误的数据。
如果您将数据存储在数据库中,只需将数据传递到 saveImageToDB
。将 saveImageToDB
中的 image
更改为 imageData
并删除所有从字符串到数据再到图像的转换。您从数据开始并希望保存数据,因此没有理由这样做。
是的,我知道还有其他类似的问题,但似乎还没有适合我的答案...
我有一个 api 调用 return 是一个 base64 字符串。这个我尝试保存到核心数据然后return作为图片。不过我不知道哪里出了问题,也许你们中的一些聪明人可以帮助我。
这是我从 api 电话接收数据的地方:
let image = data?.base64EncodedString()
saveImageToDB(brandName: imageBrandName, image: image!)
品牌名称只是一个字符串,例如:"Baresso".
我的 saveImageToDB:
func saveImageToDB(brandName: String, image: String) {
let managedContext = getContext()
let entity = NSEntityDescription.entity(forEntityName: "CoffeeShopImage", in: managedContext)!
let CSI = NSManagedObject(entity: entity, insertInto: managedContext)
let image = UIImage(named: image)
//this is the line that appears to be wrong
let imageData = NSData(data: (UIImagePNGRepresentation(image!)?.base64EncodedData())!)
CSI.setValue(imageData, forKey: brandName)
do {
try managedContext.save()
print("saved!")
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
}
我的获取函数:
func getImageFromDB(callback: @escaping (_ image: UIImage)-> ()) {
var imageFromDB: UIImage?
let fetchRequest: NSFetchRequest<NSManagedObject> = NSFetchRequest(entityName: "CoffeeShopImage")
do {
let searchResults = try getContext().fetch(fetchRequest)
for images in searchResults {
let image = images.value(forKey: "Baresso") as! NSData
imageFromDB = UIImage(data: image as Data)!
callback(imageFromDB!)
}
} catch {
print("Error with request: \(error)")
}
}
我的错误日志:
fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb)
看来我没有保存我的图像,这有点道理,但是我不知道我做错了什么?
编辑:
我搞砸了我的类型。修改后的代码如下:
func saveImageToDB(brandName: String, image: NSData) {
let managedContext = getContext()
let entity = NSEntityDescription.entity(forEntityName: "CoffeeShopImage", in: managedContext)!
let CSI = NSManagedObject(entity: entity, insertInto: managedContext)
CSI.setValue(image, forKey: "image")
CSI.setValue(brandName, forKey: "brandName")
do {
try managedContext.save()
print("saved!")
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
}
你的类型全乱了。
您从 data
开始,我假设它是数据并将其转换为名为 image
的字符串。然后在 saveImageToDB
中,您将字符串 image
视为 UIImage
并尝试首先使用 UIImagePNGRepresentation
将其转换为数据(这将失败,因为它是一个字符串)然后您尝试将该数据转换为字符串,然后尝试将该字符串转换回同样错误的数据。
如果您将数据存储在数据库中,只需将数据传递到 saveImageToDB
。将 saveImageToDB
中的 image
更改为 imageData
并删除所有从字符串到数据再到图像的转换。您从数据开始并希望保存数据,因此没有理由这样做。