将 UIImage 作为二进制数据保存到 CoreData 实体时出错
Posted
技术标签:
【中文标题】将 UIImage 作为二进制数据保存到 CoreData 实体时出错【英文标题】:Error saving UIImage to CoreData entity as Binary Data 【发布时间】:2014-12-29 01:50:06 【问题描述】:当尝试将 UIImage 保存到 CoreData 持久存储时,我收到以下错误:
NSConcreteMutableData CGImage]:无法识别的选择器发送到实例 0x7fe85a4b5cd0 2014-12-28 20:27:16.307 MyAppName[1578:245578] 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSConcreteMutableData CGImage]:无法识别的选择器发送到实例 0x7fe85a4b5cd0”
在setImage(image: UIImage)
函数的self.image = data
行引发异常。
这里是我创建 UIImage 实例的地方:
let ipaIcon = CoreData.newIconWithImageAndName(UIImage(named: "IPA-Day.png")!, name: "IPA-Day")
这个函数在我的数据访问层:
class func newIconWithImageAndName(image:UIImage, name:String) -> Icon?
if(Icon.ExistsInStorage(name))
return nil
var description = NSEntityDescription.entityForName(Lookup.EntityName.Icon.rawValue, inManagedObjectContext: context)
var newIcon = Icon(entity: description!, insertIntoManagedObjectContext: context)
newIcon.setImage(image)
newIcon.name = name
var saveError: NSError?
context.save(&saveError)
if let error = saveError
println("Error creating new icon with image and name: \(name)")
return nil;
return newIcon
这是我保存将图像转换为 NSData 并尝试将其设置为托管对象的 NSData 属性的代码:
func setImage(image: UIImage)
let data: NSData = UIImagePNGRepresentation(image)
self.image = data
这是我的 xcdatamodel 的屏幕截图:
*** 我正在使用 Swift(1.1) 运行最新版本的 Xcode(6.1)。
【问题讨论】:
您的属性名称和自定义设置器之间存在冲突。这就是造成问题的原因。 请使用您设置图像的代码更新您的帖子。 我只是有一个建议,在数据库上保存一个很小的图像并不是一个好主意。因此,如果您没有任何具体理由这样做,我宁愿保存图像路径和延迟实例化图像。假设您在内存中加载 100 个 NSData 对象的 100 个图标,它们很快就会填满设备内存。 @AdeelUrRehman,我已经用您要求的代码更新了帖子。 @Andrea,我会接受你的建议。我已经阅读了一些关于它的内容,这似乎是合理的。我倾向于在 CoreData 中保存图像,因为对象将来自服务器,但即使在这种情况下,我认为我仍然应该将图像保存到文件系统中。不过,我仍然对我的问题感兴趣。我在 Obj.-C 中以相同的方式保存了图像并且效果很好,所以我很好奇为什么这不起作用。谢谢。 【参考方案1】:尝试这样做:
newIcon.image = UIImagePNGRepresentation(image)
而不是这个:
newIcon.setImage(image)
您为 image 属性明确定义了一个 setter,但参数类型错误。你必须这样做:
func setImage(data: NSData)
image = data
然后这样称呼它:
newIcon.setImage(UIImagePNGRepresentation(image))
【讨论】:
编译器将 setImage 方法解释为自动连接设置器的自定义实现(正如我应该预料的那样,顺便说一句) - 因此,它正在调用自己。我一起摆脱了 setImage 方法,只是在设置值时使用 UIImagePNGRepresentation(image:) 执行了设置。谢谢!【参考方案2】:您正面临这个问题,因为您试图将消息 CGImage 发送到一个当然没有 CGImage 方法的 NSData 实例。
当您认为转换 NSData 实例是 UIImage 时重视尝试转换,它会生成错误。
【讨论】:
我不知道它是如何成为 CGImage 的实例的。我将它实例化为 UIImage。异常在setImage(image: UIImage)
函数的self.image = data
行引发。我可以在 lldb 调试器中验证类型。以上是关于将 UIImage 作为二进制数据保存到 CoreData 实体时出错的主要内容,如果未能解决你的问题,请参考以下文章
如何将SKSpriteNode作为PNG图像保存到相机胶卷?
将 UIImage 保存到文件而不是 NSUserDefaults