将 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 实体时出错的主要内容,如果未能解决你的问题,请参考以下文章

将 UIImage 保存到 Core Data 时出错

如何将SKSpriteNode作为PNG图像保存到相机胶卷?

将 UIImage 保存到文件而不是 NSUserDefaults

Swift 核心数据 FetchRequest NSData 到 UIIMage

将 UIImage 数据保存到 iOS 中的照片库后取回

iOS Swift - 在 UIImage 上画线以保存到文件