Search code examples
arraysimageswiftios8store

Can you save an array of images in core data?


I know you can save one by using the binary data property of an entity but is it possible to save multiple?

you can save one by using this:

UIImageJPEGRepresentation(image: UIImage)

you can save it and then transform it into an image again with

UIImage(data: ____)

but can I transform an array full of images into binary data?

If you can't with core data, any other ways I can do it?

BTW, the image array is full of user taken image saved on the device..

Thanks for all the helpers!


Solution

  • convert your array to NSMutableArray and archive it as NSData

    var imgArray = [UIImage]();
    
    var CDataArray = NSMutableArray();
    
    for img in imgArray{
        let data : NSData = NSData(data: UIImagePNGRepresentation(img))
        CDataArray.addObject(data);
    }
    
    //convert the Array to NSData
    //you can save this in core data
    var coreDataObject = NSKeyedArchiver.archivedDataWithRootObject(CDataArray);
    

    after pulling from CData, extract data:

    //extract:
    if let mySavedData = NSKeyedUnarchiver.unarchiveObjectWithData(coreDataObject) as? NSArray{
        //extract data..
    }
    

    Swift 5

    There are some methods deprecated now. The following code is working in Swift 5:

    func coreDataObjectFromImages(images: [UIImage]) -> Data? {
        let dataArray = NSMutableArray()
        
        for img in images {
            if let data = img.pngData() {
                dataArray.add(data)
            }
        }
        
        return try? NSKeyedArchiver.archivedData(withRootObject: dataArray, requiringSecureCoding: true)
    }
    
    func imagesFromCoreData(object: Data?) -> [UIImage]? {
        var retVal = [UIImage]()
    
        guard let object = object else { return nil }
        if let dataArray = try? NSKeyedUnarchiver.unarchivedObject(ofClass: NSArray.self, from: object) {
            for data in dataArray {
                if let data = data as? Data, let image = UIImage(data: data) {
                    retVal.append(image)
                }
            }
        }
        
        return retVal
    }