Swift 3 - 将图像保存到Core Data

Ste*_* L. 5 base64 core-data ios swift3

出于某种原因,我无法弄清楚如何将图像保存到核心数据并再次获取它们.我觉得这是我的类型,但看看:

图像保存为二进制数据并存储在外部记录文件中

我从api调用我的服务器获取数据.它返回一个base64字符串.这是我获取数据的地方:

updateAccessTokenOnly(newAccessToken: aToken!)
saveImageToDB(brandName: imageBrandName, image: data! )
Run Code Online (Sandbox Code Playgroud)

在这里,我将它保存到我的DB:

func saveImageToDB(brandName: String, image: Data) {
    dropImages(){tableDropped in
        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)")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后去取它:

    func getImageFromDB(callback: @escaping (_ image: UIImage)-> ()) {

    let fetchRequest: NSFetchRequest<NSManagedObject> = NSFetchRequest(entityName: "CoffeeShopImage")

    do {
        let searchResults = try getContext().fetch(fetchRequest)

        for images in searchResults {
            print("vi når her ned i get image")
            if (images.value(forKey: "brandName")! as! String == "Baresso"){
                print(images.value(forKey: "brandName")! as! String)

                let image: Data = images.value(forKey: "image")! as! Data
                let decodedimage = UIImage(data: image)

                callback(decodedimage!)

            }
        }
    } catch {
        print("Error with request: \(error)")
    }
}
Run Code Online (Sandbox Code Playgroud)

完整错误日志:

https://docs.google.com/document/d/1gSXE64Sxtzo81eBSjv4bnBjBnnmG4MX2tuvNtnuJDIM/edit?usp=sharing

希望有人能提供帮助.提前致谢!

更新

所以我卸载了应用程序,然后上面的代码工作.然而这些照片是蓝色的吗?(是的,我已经检查过从数据库发送的图片是否正确).

有解决方案吗

从CoreData获取的图片

Jon*_*ose 11

更换

let image: Data = images.value(forKey: "image")! as! Data
let dataDecoded : Data = Data(base64Encoded: image, options: [])!
let decodedimage = UIImage(data: dataDecoded)
Run Code Online (Sandbox Code Playgroud)

let image: Data = images.value(forKey: "image")! as! Data
let decodedimage = UIImage(data: image)
Run Code Online (Sandbox Code Playgroud)

Base64是一种将数据转换为字符串的方法.这里没有理由使用它.您已经拥有了数据库中的数据,您只想将其转换为UIImage.

也改变了

let image = data?.base64EncodedData()
saveImageToDB(brandName: imageBrandName, image: image!)
Run Code Online (Sandbox Code Playgroud)

saveImageToDB(brandName: imageBrandName, image: data!)
Run Code Online (Sandbox Code Playgroud)

base64EncodedData将数据从图像数据转换为基于utf-8编码的64编码字符串.没有理由这样做.

您应该从服务器获取base64编码的字符串,将其转换为数据,然后再也不需要base64.读取和写入数据到数据库,并阅读后其转换为一个UIImage.Base64是一种传输数据的编码方法.如果您不与服务器通信,则没有理由使用base64.