将一组图像上传到 coredata

Posted

技术标签:

【中文标题】将一组图像上传到 coredata【英文标题】:Upload an array of images to coredata 【发布时间】:2020-08-23 06:33:14 【问题描述】:

当我只需要将一张图片上传到 coredata 时,我只有一个带有图片字段的实体餐厅,

然后,当我需要上传多张图片时,我创建了另一个名为 images 的实体,其中包含字段、图片和 id,餐厅中也有 id 字段,

现在,如果用户想要使用餐厅的多张图片,我使用 opalimagepicker 选择多张图片,然后返回一组 var arrayOfImages = [UIImage]()

对于单个图像,代码非常简单,我只需在 UIImageView 中显示图像,然后使用相同的图像上传到核心数据,如下所示

if let restaurantImage = cell5.imageToUpload.image 
          restaurant.image = restaurantImage.pngData()
        

但现在我希望将多个图像存储在图像实体中,每个图像对应于相同的 id ,即用户的 id 如下所示

image1 - abc

image2 - abc

再说一次,我知道如何在一个实体模型中上传单个图像,但如何在多个实体模型中上传图像数组

但是我不知道coredata的方法,谁能给我一个有用的方法来解决它,谢谢,我的关系模型已附上

餐厅实体中还有一个图片字段,如何调整?

UPADTE - 所以我可以使用它在 coredata 餐厅实体中保存图像数组。使用@danielson 指导

for image in arrayOfImages 
          print("saved")
          restaurant.image = image.pngData()
        

但是在其他数据库中我不能使用 select 语句来查看数据是如何保存的,我没有任何方法可以找到它是如何完成的,

我如何从数组中提取第二个图像,目前只有一个图像,我正在这样做,这是为了从核心数据中获取数据并显示它,但是我现在如何从数组中显示某个图像?

if let restaurantImage = restaurant.image 
                     cell.restaurantMiniImage.image = UIImage(data: restaurantImage as Data)
                   

更新

import Foundation
import CoreData


extension Restaurant 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Restaurant> 
        return NSFetchRequest<Restaurant>(entityName: "Restaurant")
    

    @NSManaged public var id: UUID?
    @NSManaged public var image: Data?
    @NSManaged public var isVisited: Bool
    @NSManaged public var location: String?
    @NSManaged public var name: String?
    @NSManaged public var phone: String?
    @NSManaged public var rating: String?
    @NSManaged public var summary: String?
    @NSManaged public var type: String?
    @NSManaged public var images: NSSet?



// MARK: Generated accessors for images
extension Restaurant 

    @objc(addImagesObject:)
    @NSManaged public func addToImages(_ value: Images)

    @objc(removeImagesObject:)
    @NSManaged public func removeFromImages(_ value: Images)

    @objc(addImages:)
    @NSManaged public func addToImages(_ values: NSSet)

    @objc(removeImages:)
    @NSManaged public func removeFromImages(_ values: NSSet)







import Foundation
import CoreData


extension Images 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Images> 
        return NSFetchRequest<Images>(entityName: "Images")
    

    @NSManaged public var id: UUID?
    @NSManaged public var image: Data?
    @NSManaged public var origin: Restaurant?








 var arrayOfImages = [UIImage]()
    
    func getAssetThumbnail(assets: [PHAsset]) -> [UIImage] 
       
        for asset in assets 
            let manager = PHImageManager.default()
            let option = PHImageRequestOptions()
            var image = UIImage()
            option.isSynchronous = true
            manager.requestImage(for: asset, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFit, options: option, resultHandler: (result, info)->Void in
                image = result!
                self.arrayOfImages.append(image)
            )
        
        return arrayOfImages
    
    
    

【问题讨论】:

建立“多人”关系对你有用吗?您可以以这种方式存储具有相同餐厅来源的多张图像。 @aswath - 它是一对多,但我不知道 coredata 查询能够在图像实体中插入图像,这将对应于餐厅用户的 id @JoakimDanielson - 感谢我是 coredata 的新手,我最终使用了 classDefinition codegen 选项而不是 manual,因此我没有在我的导航器中获得类 Restaurant,但是现在我尝试使用代码和手动选项我在每次使用 Restaurant 关键字访问该实体的地方都会出错,我该如何继续? 【参考方案1】:

您的Restaurant 类将有一个您可以使用的函数addToImages。所以这样的事情应该可以工作

Images(实际上应该命名为Image)创建一个自定义的init方法来简化其余代码

extension Images 
     convenience init(context: NSManagedObjectContext, image: UIImage) 
          self.init(context: context)
          self.id = UUID()
          self.image = image.pngData()
     

然后

var arrayOfImages = [UIImage]()
    
for image in arrayOfImages 
    restaurant.addToImages(Images(context: moc, image: image))

或者一次性

restaurant.addToImages(Set(arrayOfImages.map  Images(context: moc, image: $0 )) 

在上述代码示例中,mocNSManagedObjectContext 的一个实例。

要访问图像,您可以读取 Restaurantimages 属性,例如像这样获取 UIImage 数组

let imageArray = restaurant.images.map  UIImage(data: $0.image as Data) 

关于Restaurant中的image属性:您可以删除核心数据模型中不再使用的任何属性

【讨论】:

谢谢,那么图像实体的用途是什么,图像数据会自动输入它,我将如何检索这些图像?我不知道 coredata 因此问跨度> 所以现在我可以保存所有图像,目前我使用此代码显示核心数据中的图像 -- if let restaurantImage = restaurant.image cell.restaurantMiniImage.image = UIImage( data: restaurantImage as Data) ---- 但是假设我尝试在数组中显示第二张图像并使用 restaurant.image[1],它给出的错误,我做错了什么,谢谢 所以现在我使用 arrayOfImages print("saved") restaurant.image = image.pngData() 保存了数据,我想知道如何检索它才能如果图像访问特定的图像表单数组 您可以使用 Restaurant 类中的 images 属性访问图像,该属性返回一组 Images Joakim Danielson,谢谢,但我现在正在运行您的代码,现在我已经手动编译类但我不断收到错误 - 调用实例方法“addToImages”没有完全匹配,这是我在我的类 - @objc(addImages:) @NSManaged public func addToImages(_ values: NSSet)

以上是关于将一组图像上传到 coredata的主要内容,如果未能解决你的问题,请参考以下文章

如何根据内容将一组图像文件聚集到不同的文件夹

如何通过 iOS 中的 JSON webservices post 方法将一组图像发送到服务器?

将一组图像分类为类

如何将一组图像拼接成 MxN 图像拼贴

如何将缓冲区图像上传到 cloudinary?

如何使用 Laravel 正确上传一组图像