Swift 3 - 从核心数据

时间:2017-02-23 12:53:44

标签: core-data swift3 uiimage base64

是的,我知道还有其他问题,但似乎没有答案对我有用......

我有一个返回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)")
    }
}

1 个答案:

答案 0 :(得分:1)

你的类型都搞砸了。

您从data开始,我假设它是数据并将其转换为名为image的字符串。然后在saveImageToDB中,您将字符串image视为UIImage,并尝试使用UIImagePNGRepresentation将其首先转换为数据(因为它是字符串会失败)您尝试将该数据转换为字符串,然后尝试将该字符串转换回数据,这也是错误的。

如果要在数据库中存储数据,只需将数据传递到saveImageToDB即可。将image中的saveImageToDB更改为imageData,并删除从字符串到数据转换为图像和返回的所有内容。您从数据开始并希望保存数据,因此没有理由这样做。