swift从核心数据中获取特定的uiimage

时间:2017-04-14 00:01:04

标签: ios swift core-data uiimage nsdata

我对swift和核心数据都很陌生。所以如果这个逻辑没有意义,请告诉我。

我正在尝试将用户的图像保存到核心数据,并能够删除所选的图像。 我有实体“媒体”,属性“照片”类型“二进制数据”

这里我将UIImage转换为NSData

let data = UIImagePNGRepresentation(addedImage!) as NSData?

并保存。

let newPhoto = NSEntityDescription.insertNewObject(forEntityName: "Media", into: context)
newPhoto.setValue(imageData, forKey: "photo")

在这里,我尝试使用谓词

从核心数据中检索一个选定的图像
func deleteImage(imageData: NSData) {

        let context = appDelegate.persistentContainer.viewContext
        let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Media")
        request.returnsObjectsAsFaults = false
        request.predicate = NSPredicate(format: "photo =%@", imageData)

        do {
            let results = try context.fetch(request)
           ...

我收到此错误消息。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[OS_dispatch_data _bytesPtrForStore]: unrecognized selector sent to instance

保存并获取实体“Media”中的所有图像效果非常好。我只是无法得到具体的那个。

有什么想法/建议? 感谢。

2 个答案:

答案 0 :(得分:1)

保存此类图片,并为该属性启用外部存储,可以即可。但是这里有一些非常不寻常的事情。

常见的方法是让图像成为具有其他信息的实体的一部分,而不是实体的主要价值。例如,表示人并具有姓名,地址等和图片的实体类型。在实体中存储只是一张图片有点奇怪。使用Core Data而不是更简单的东西,你没有得到太多的东西。如果没有别的,我猜你在这个实体中有照片ID,标题或其他一些数据。

第二件事与此有关 - 尝试使用基于二进制数据属性的谓词来获取是极其罕见的。我猜它可能工作,但前提是你可以确保谓词值与持久存储中的谓词值完全相同 - 而不是二进制blob中的单个位更改。这可能是真的,但我不会依赖于UIKit在做出微妙不同的方式上做某事。我从未见过那个特别的错误信息,但我并不感到惊讶,因为这不起作用。

最后,基于获取请求删除对象也是不寻常的(尽管不像上面那么奇怪)。您可以在获取图像之前获取这些对象。为什么再次获取同一个对象只是为了删除它?删除你已经提取的那个。

更可靠的方法是至少在实体中包含唯一ID,可以是整数或UUID或其他适合您的ID。获取此实体并使用photo属性显示图像。如果要删除一个,请从提取中获取托管对象,并告诉上下文删除该对象。或者,如果出于某种原因需要提取,请使用谓词中的唯一ID而不是二进制数据。

答案 1 :(得分:0)

你最好停止这样做。当您有更多记录时,将大量数据(图像,音频,视频等)保存到核心数据将大大降低获取速度。而是将图像保存到application folder,然后仅将其网址保存到核心数据。