首页 文章

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

提问于
浏览
0

我对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

保存并从实体“媒体”获取所有图像非常有效 . 我只是无法得到具体的一个 .

有什么想法/建议?谢谢 .

2 回答

  • 0

    保存这样的图像,并为该属性启用外部存储, can 即可 . 但是这里有一些非常不寻常的事情 .

    常见的方法是使图像成为具有其他信息的实体的一部分,但不作为实体的主要 Value . 例如,表示人并且具有姓名,地址等和图片的实体类型 . 在实体中存储 just a picture 有点奇怪 . 您're not getting much of anything from using Core Data over something simpler. If nothing else I' d猜测您在实体中有照片ID, Headers 或其他一些数据 .

    第二件事与此有关 - 尝试使用基于二进制数据属性的谓词来获取是极其罕见的 . 我猜它 might 工作,但前提是你可以确保谓词值与持久存储中的谓词值完全相同 - 而不是二进制blob中的单个位更改 . 这可能是真的,但我从来没有见过那个特定的错误信息,但是我没有工作 .

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

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

  • 1

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

相关问题