是的,我知道还有其他问题,但似乎没有答案对我有用......
我有一个返回base64字符串的api调用。我试着保存到核心数据然后作为图片返回。我无法弄清楚我出错的地方,也许你们中的一些聪明人可以帮助我。
这是我从api电话中接收数据的地方:
let image = data?.base64EncodedString()
saveImageToDB(brandName: imageBrandName, image: image!)
brandName只是一个字符串,例如:" 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)")
}
}
答案 0 :(得分:1)
你的类型都搞砸了。
您从data
开始,我假设它是数据并将其转换为名为image
的字符串。然后在saveImageToDB
中,您将字符串image
视为UIImage
,并尝试使用UIImagePNGRepresentation
将其首先转换为数据(因为它是字符串会失败)您尝试将该数据转换为字符串,然后尝试将该字符串转换回数据,这也是错误的。
如果要在数据库中存储数据,只需将数据传递到saveImageToDB
即可。将image
中的saveImageToDB
更改为imageData
,并删除从字符串到数据转换为图像和返回的所有内容。您从数据开始并希望保存数据,因此没有理由这样做。