Удаление и перезапись и перезапись обратно приводит к ошибкам - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь создать приложение, в котором пользователь работает с изображениями и создает структуры, которые содержат несколько изображений с соответствующими значениями.когда пользователь заполняет всю информацию и нажимает сохранить, генерируется структура, а затем изображение сохраняется в FileManager.default, а остальная информация сохраняется в пользовательских значениях по умолчанию:

guard let documentDirectoryPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
            return
        }

        let imageName = name+"_"+String(banknote.key)+".png"
        let imgPath = documentDirectoryPath.appendingPathComponent(imageName)

        do {
            try banknote.value.pngData()?.write(to: imgPath)
            self.imageLoc[banknote.key] = imageName

        } catch {
            print("its an error")
        }

И затем я используюфункция, которая вытягивает изображения для каждого экземпляра обратно в UIImages, если необходимо, например:

func getImages() -> [Int:UIImage]{
    var unarchivedImages = [Int:UIImage]()

    if !self.images.isEmpty {
        let documentDirectoryPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

        for imageLoc in images{
            let imageURL = documentDirectoryPath.appendingPathComponent(imageLoc.value)
            let image = UIImage(contentsOfFile: imageURL.path)
            unarchivedImages[imageLoc.key] = image
        }
    }

Проблема, однако, возникает, когда пользователь хочет обновить экземпляр, скажем, изменить какую-то другую переменную внутри.Моя процедура заключается в том, чтобы сначала удалить изображения следующим образом:

let documentDirectoryPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
        for imageLoc in images{

            let imageURL = documentDirectoryPath.appendingPathComponent(imageLoc.value)

            if FileManager.default.fileExists(atPath: imageURL.path){
                try? FileManager.default.removeItem(atPath: imageURL.path)
            } else {
                print("failed")
            }

        }

, а затем создать новый экземпляр и снова сохранить его, как в первом блоке кода.Однако, если я использую процедуру удаления, показанную выше, сохранение изображения больше не работает и выдает ошибку:

CreateDataWithMappedFile: 1429: «открыть» не удалось / var / mobile / Containers / Data / Application /83615D52-A4E7-4930-ABE3-B3702AC294F2 / Documents / h_1.png 'error = 2 (Нет такого файла или каталога)

handle_write_error: 103: ошибка потока

handle_write_error: 103: нет IDATзаписано в файл

Есть идеи?

1 Ответ

0 голосов
/ 14 июня 2019

После нескольких часов бесполезной отладки я обнаружил проблему.Проблема заключается в том, что инициализация и передача изображений через UIImage (contentsOfFile: ...) и UIImage (named: ...) оба сохраняют ссылку на файл, а не сохраняют данные, что более важно, потому что ссылка в конечном итоге получаетудаляется, пока это данные, которые передаются.Таким образом, решение заключается в использовании:

let imageData = try? Data(contentsOf: imageURL)
let image = UIImage(data: imageData!)
...