从Core Data获取图像

时间:2016-01-13 12:36:50

标签: ios swift image core-data nsdata

我正在研究Cocktailapp,并希望将我的图像数据保存到Core Data。 我看了一些教程并做了同样的事情,但它仍然没有工作,我不知道为什么。

我有一个包含图像所有标题的数组:

let imagesAperitif: [String] = ["americano.jpg", "daiquiri.jpg",
        "frozen daiquiri.jpg",
        "banana frozen daiquiri.jpg", "bronx.jpg", "kir.jpg",
        "hugo.jpg", "Manhattann.jpg", "manhattan dry.jpg", "manhattan medium.jpg", "margarita.jpg",
        "martini dry.jpg",...

这就是我调用我的方法将图像保存到Core Data的地方:

setCocktails(nameInsert, zutaten: zutatenInsert, zubereitung: zubereitungInsert, dekoration: dekorationInsert, stil: stilInsert, bild: UIImage(named: imagesAperitif[index])!)

这是saveCocktails方法代码的一部分:

let imageData = NSData(data: UIImageJPEGRepresentation(bild, 1.0)!)
eintrag.setValue(imageData, forKey: "bild")

do {
    try managedContext.save()

这是获取方法的一部分:

let fetchRequest = NSFetchRequest(entityName: "Cocktail")

do {
    let results =
    try managedContext.executeFetchRequest(fetchRequest)
    cocktails = results as! [NSManagedObject]

在这里,我想从NSData获取我的图像:

imagesAperitif.append(UIImage(data: eintrag.valueForKey("bild") as! NSData)!)

但是应用程序崩溃了这一行,我得到了一个“致命的错误:在解开一个Optional值时意外地发现了nil”错误。

有人能够向我解释这个,因为我不知道该改变什么。我尝试的一切也都错了。

2 个答案:

答案 0 :(得分:0)

您可能需要nil检查eintrag.valueForKey("bild")之前NSData

作为     func valueForKey(_ key:String) - > AnyObject?

在追加nil

之前,始终保存以检查UIImage(data: eintrag.valueForKey("bild") as! NSData)

答案 1 :(得分:0)

(我喜欢使用后卫,所以这里:) :)

那么我会在这里做什么,因为看起来插入NSData对象失败了:

// We are simultaniously unwrapping objects and checking if objects are nil.
guard let imgAsNSData: NSData = UIImageJPEGRepresentation(bild, 1.0),
    let entity: Cocktail = eintrag as? Cocktail else {
        // Stop executing the method here, there is no point in going further. Handle any errors here! Either imgAsNSData is nil, or could not cast to your class. A guard statement handles it's errors here.
        return
}

// At this point we know we have an NSData object. Assign it to the entity.
entity.bild = imgAsNSData

do {
    // Save our entity.
    try managedContext.save()
} catch {
    // Handle error
}

撷取:

let fetchRequest = NSFetchRequest(entityName: "Cocktail")

do {
    let results: [NSManagedObject] = try managedContext.executeFetchRequest(fetchRequest)
guard let cocktails = results as? [Cocktail] else {
    // Could not cast to an array of Cocktail objects.
    return
}

// Do stuff with the cocktails object.

添加到您的阵列:

// 1: Check if entity not is nil
// 2: Check if entity's bild property not is nil.
// 3: Check if we can create an image using the NSData
guard let cocktail: Cocktail = eintrag as? Cocktail,
    let imgAsNSData: NSData = cocktail.bild,
    let image: UIImage = UIImage(data: imgAsNSData) else {
        // Required values are nil. Cannot proceed.
        return
}

imagesAperitif.append(image)

未经测试的代码所以要小心:)