Обработка загрузки / сохранения изображений в UIDocument, который содержит несколько изображений
У меня есть простой объект модели Location
с несколькими текстовыми элементами и images : [UIImages]?
, Location
является Codable
поэтому я сохраняю текстовые биты как JSON, а затем записываю изображения в тот же FileWrapper
,
Мой вопрос заключается в том, как сохранить отношения между файлами изображений и массивом [UIImage]. Изображения должны возвращаться в том же порядке. Есть ли способ, которым я могу подключиться к Coding, чтобы массив заменялся URL-адресами, указывающими на изображения?
Или, альтернативно, я должен всегда иметь изображения в виде отдельных файлов, скажем, в каталоге кэша, и заменить [UIImage] на [URL]
1 ответ
Вот пример хранения набора файлов изображений в оболочке файла вместе с "индексом" (который я называю list
) их имен в определенном порядке:
let fm = FileManager.default
let docurl = fm.urls(for: .documentDirectory, in: .userDomainMask)[0]
let d = FileWrapper(directoryWithFileWrappers: [:])
let imnames = ["manny.jpg", "moe.jpg", "jack.jpg"]
for imname in imnames {
let im = UIImage(named:imname)!
let imfw = FileWrapper(regularFileWithContents: UIImageJPEGRepresentation(im, 1)!)
imfw.preferredFilename = imname
d.addFileWrapper(imfw)
}
let list = try! JSONEncoder().encode(imnames)
let listfw = FileWrapper(regularFileWithContents: list)
listfw.preferredFilename = "list"
d.addFileWrapper(listfw)
do {
try d.write(to: docurl.appendingPathComponent("myFileWrapper"), originalContentsURL: nil)
print("ok")
} catch {
print(error)
}
И вот пример чтения этой оболочки файлов путем извлечения списка и последующего получения файлов изображений по имени в том же порядке:
let fm = FileManager.default
let docurl = fm.urls(for: .documentDirectory, in: .userDomainMask)[0]
let fwurl = docurl.appendingPathComponent("myFileWrapper")
do {
let d = try FileWrapper(url: fwurl)
if let list = d.fileWrappers?["list"]?.regularFileContents {
let imnames = try! JSONDecoder().decode([String].self, from: list)
for imname in imnames {
if let imdata = d.fileWrappers?[imname]?.regularFileContents {
print("got image data for", imname)
// in real life, do something with the image here
}
}
} else {
print("no list")
}
} catch {
print(error); return
}
Это печатает:
got image data for manny.jpg
got image data for moe.jpg
got image data for jack.jpg
Все, что вы хотите сделать в UIDocument - это то же самое, за исключением того, что UIDocument напишет и прочитает упаковщик файлов для вас.