我正在研究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”错误。
有人能够向我解释这个,因为我不知道该改变什么。我尝试的一切也都错了。
答案 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)
未经测试的代码所以要小心:)