你能在core data中保存一组图像吗?



我知道你可以通过使用实体的二进制数据属性来保存一个,但是可以保存多个吗?

你可以这样保存一个:

UIImageJPEGRepresentation(image: UIImage)

你可以保存它,然后用

将它再次转换为图像
UIImage(data: ____)

,但我可以转换数组的图像到二进制数据?

如果core data不行,还有其他方法吗?

顺便说一句,图像数组中充满了保存在设备上的用户拍摄的图像。

感谢所有的帮手!

将数组转换为NSMutableArray并存档为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);

从CData中提取数据:

//extract:
if let mySavedData = NSKeyedUnarchiver.unarchiveObjectWithData(coreDataObject) as? NSArray{
    //extract data..
}
<标题>迅速5

现在有一些方法被弃用了。下面的代码在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
}

根据daniel-krom的回答,我创建了一个快速扩展,使其易于添加到模型对象:

let coreDataObject = imgArray.coreDataRepresentation()
if let retrievedImgArray = coreDataObject?.imageArray() {
    // use retrievedImgArray
}

这是扩展名

import UIKit
typealias ImageArray = [UIImage]
typealias ImageArrayRepresentation = Data
extension Array where Element: UIImage {
    // Given an array of UIImages return a Data representation of the array suitable for storing in core data as binary data that allows external storage
    func coreDataRepresentation() -> ImageArrayRepresentation? {
        let CDataArray = NSMutableArray()
        for img in self {
            guard let imageRepresentation = UIImagePNGRepresentation(img) else {
                print("Unable to represent image as PNG")
                return nil
            }
            let data : NSData = NSData(data: imageRepresentation)
            CDataArray.add(data)
        }
        return NSKeyedArchiver.archivedData(withRootObject: CDataArray)
    }
}
extension ImageArrayRepresentation {
    // Given a Data representation of an array of UIImages return the array
    func imageArray() -> ImageArray? {
        if let mySavedData = NSKeyedUnarchiver.unarchiveObject(with: self) as? NSArray {
            // TODO: Use regular map and return nil if something can't be turned into a UIImage
            let imgArray = mySavedData.flatMap({
                return UIImage(data: $0 as! Data)
            })
            return imgArray
        }
        else {
            print("Unable to convert data to ImageArray")
            return nil
        }
    }
}

最新更新