Ios swift从核心数据获取特定uiimage

Ios swift从核心数据获取特定uiimage,ios,swift,core-data,uiimage,nsdata,Ios,Swift,Core Data,Uiimage,Nsdata,我对swift和核心数据非常陌生。所以如果这个逻辑不合理,请告诉我 我正在尝试将用户的图像保存到核心数据,并能够删除选定的图像。 我有实体“媒体”,属性“照片”类型“二进制数据” 这里我将UIImage转换为NSData let data = UIImagePNGRepresentation(addedImage!) as NSData? 并保存它 let newPhoto = NSEntityDescription.insertNewObject(forEntityName: "Media"

我对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)
           ...
保存和获取实体“媒体”中的所有图像工作正常。我就是找不到具体的

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

你最好别再做了。当您有更多记录时,将大量数据(图像、音频、视频等)保存到核心数据将大大降低获取速度。相反,请将图像保存到,然后仅将其url保存到核心数据。

这样保存图像,并为属性启用外部存储,就可以了。但是这里发生了一些非常不寻常的事情

常用的方法是将图像作为包含其他信息的实体的一部分,但不作为实体的主要值。例如,表示一个人的实体类型,具有姓名、地址等和图片。在实体中只存储一张图片有点奇怪。使用核心数据而不是使用更简单的数据,您不会得到什么好处。如果没有其他东西,我猜你在实体中有照片ID、标题或其他数据

第二件事与此相关——尝试使用基于二进制数据属性的谓词进行获取是极不寻常的。我想它可能会起作用,但前提是您可以确保谓词值始终与持久性存储中的值相同——二进制blob中没有任何一位发生更改。这可能是真的,但我不会指望UIKit在这一过程中没有做一些细微的改变。我从来没有看到过那个特定的错误消息,但我并不奇怪它不起作用

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


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

在本教程中,您可以找到如何存储图像并获取“在获取图像之前,您应该获取这些对象”。为什么再次获取相同的对象只是为了删除它?删除您已经获取的数据。“我是否可以将获取的[NSManagedObject]保存在某个位置,并在任何时候删除我想要的数据?”在谓词中使用唯一ID而不是二进制数据“您的意思是有另一个唯一ID的属性?”?我认为二进制数据是保存图像所需要的类型。谢谢你的帮助!如果您想保存托管对象并删除它,那么我真的不知道您要做什么。保存图像时需要一个二进制属性,但在一个实体上可以有多个属性。在获取图像之前,您应该先获取这些对象。为什么再次获取相同的对象只是为了删除它?删除你已经获取的。好吧,那么我不明白你在说什么。我认为,为了删除核心数据中的某些内容,您需要首先获取该对象。获取要显示的图像和获取要删除的图像是两种不同的操作。它们不是按顺序发生的。谢谢!我会调查的。不,你仍然可以使用核心数据。二进制数据属性有“允许外部存储”等参数;在那里,您可以避免手动链接/加载图像,而只需使用核心数据及其所有功能,如关系等。
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[OS_dispatch_data _bytesPtrForStore]: unrecognized selector sent to instance