在核心数据中存储经常更改的图像数组阵列的最有效方法

时间:2018-11-12 17:31:35

标签: swift core-data uiimage

因此,我一直在研究如何存储图像阵列,目前我正在使用另一种堆栈溢出文章中建议的扩展方法。

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.compactMap({
                return UIImage(data: $0 as! Data)
            })
            return imgArray
        }
        else {
            print("Unable to convert data to ImageArray")
            return nil
        }
    }
}

因此,当我保存数组时,我只需使用images.coreDataRepresentation()并将其存储在实体的二进制数据属性中即可。

我担心阵列可能包含多达900张图像,并且不断保存所有这些数据会导致延迟。我当时在考虑使用与关系数据库类似的系统,在该系统中,我保留一个单独的核心数据实体来仅保存具有基于id的关系的这些照片,但是,在进行了更多研究之后,我发现对于核心数据不建议这样做。有一个更好的方法吗?还是其中一种方法更好?

0 个答案:

没有答案