Обработка загрузки / сохранения изображений в 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 напишет и прочитает упаковщик файлов для вас.

Другие вопросы по тегам