Итак, я занимаюсь исследованием того, как хранить массив изображений, и в настоящее время я использую метод расширения, предложенный в другом посте о переполнении стека.
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 изображений, постоянное сохранение всех этих данных приведет к задержкам. Я думал об использовании системы, похожей на систему реляционных баз данных, где я держу отдельный объект основных данных для хранения исключительно этих фотографий с отношениями, основанными на идентификаторе, однако, проведя дополнительные исследования, я обнаружил, что это не рекомендуется с основными данными. Есть лучший способ сделать это? Или один из этих методов лучше?