删除图像并重新写回会产生错误

时间:2019-06-14 13:44:19

标签: swift uiimage nsfilemanager file-manager

我正在尝试构建一个应用程序,其中用户使用图像并创建包含多个具有相应值的图像的结构。当用户填写所有信息并按Save时,将生成该结构,然后将图像保存在FileManager.default中,并将其余信息保存在User Defaults中:

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:'open'失败'/var/mobile/Containers/Data/Application/83615D52-A4E7-4930-ABE3-B3702AC294F2/Documents/h_1.png'错误= 2(没有这样的文件或目录)< / p>

handle_write_error:103:流错误

handle_write_error:103:没有将IDAT写入文件

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

经过数小时徒劳的调试后,我发现了问题。问题在于,通过UIImage(contentsOfFile:...)和UIImage(named:...)初始化和传递图像都保留对文件的引用,而不是保留数据,这更重要,因为引用最终会得到已删除,但它是正在传递的数据。因此,解决方案是使用:

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