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 并删除所有从字符串到数据再到图像的转换。您从数据开始并希望保存数据,因此没有理由这样做。