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

洛蒂克

我正在尝试构建一个应用程序,用户可以在其中处理图像并创建包含具有相应值的多个图像的结构。当用户填写所有信息并按保存时,结构体生成,然后图像保存在 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' failed '/var/mobile/Containers/Data/Application/83615D52-A4E7-4930-ABE3-B3702AC294F2/Documents/h_1.png' 错误 = 2(没有这样的文件或目录)

handle_write_error:103: 流错误

handle_write_error:103: 没有 IDAT 写入文件

有任何想法吗?

洛蒂克

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

删除ubuntu并重新安装会影响Windows和其他Windows分区

来自分类Dev

删除ubuntu并重新安装会影响Windows和其他Windows分区

来自分类Dev

Laravel Sync会删除并重新创建吗?

来自分类Dev

在python OpenCV中调整和填充具有特定高度和宽度的图像会产生错误和不准确的结果

来自分类Dev

用户重新进入时退出菜单会产生错误

来自分类Dev

在许多图像上使用mogrify会产生错误

来自分类Dev

使用jQuery删除图像并重新附加图像时,不会触发载入事件

来自分类Dev

删除并重新填充 boostrapTable

来自分类Dev

删除DDL触发器会产生错误

来自分类Dev

删除被2整除的节点会产生SIGSEGV错误

来自分类Dev

从文本框中删除数字会产生错误

来自分类Dev

删除结尾的.html重写器会产生404错误

来自分类Dev

遇到错误并重新订阅

来自分类Dev

在Java小程序中删除并重新绘制图像

来自分类Dev

SDL和g ++总是会产生错误?

来自分类Dev

比较日期时间和时间会产生错误的结果

来自分类Dev

名称和说明中的“错误”值会产生奇怪的功能

来自分类Dev

为什么交换方程的 LHS 和 RHS 会产生错误?

来自分类Dev

重新加载页面时,在脚本之前加载图像,可能会产生FOUC效果

来自分类Dev

保存错误并重新渲染页面时出现Rails,显示未保存的属性和错误

来自分类Dev

错误地删除了/ boot文件夹并重新启动

来自分类Dev

试图在我的“刷新”存储过程中删除并重新创建索引,但出现错误

来自分类Dev

删除并重新插入GeoFire位置以触发onKeyExited和onKeyEntered不起作用

来自分类Dev

DataTable删除列并重新排序列

来自分类Dev

删除并重新添加功能javascript?

来自分类Dev

删除并重新排列arraylist

来自分类Dev

如何删除nginx并重新激活Apache?

来自分类Dev

删除并重新添加功能javascript?

来自分类Dev

如何删除nginx并重新激活Apache?

Related 相关文章

  1. 1

    删除ubuntu并重新安装会影响Windows和其他Windows分区

  2. 2

    删除ubuntu并重新安装会影响Windows和其他Windows分区

  3. 3

    Laravel Sync会删除并重新创建吗?

  4. 4

    在python OpenCV中调整和填充具有特定高度和宽度的图像会产生错误和不准确的结果

  5. 5

    用户重新进入时退出菜单会产生错误

  6. 6

    在许多图像上使用mogrify会产生错误

  7. 7

    使用jQuery删除图像并重新附加图像时,不会触发载入事件

  8. 8

    删除并重新填充 boostrapTable

  9. 9

    删除DDL触发器会产生错误

  10. 10

    删除被2整除的节点会产生SIGSEGV错误

  11. 11

    从文本框中删除数字会产生错误

  12. 12

    删除结尾的.html重写器会产生404错误

  13. 13

    遇到错误并重新订阅

  14. 14

    在Java小程序中删除并重新绘制图像

  15. 15

    SDL和g ++总是会产生错误?

  16. 16

    比较日期时间和时间会产生错误的结果

  17. 17

    名称和说明中的“错误”值会产生奇怪的功能

  18. 18

    为什么交换方程的 LHS 和 RHS 会产生错误?

  19. 19

    重新加载页面时,在脚本之前加载图像,可能会产生FOUC效果

  20. 20

    保存错误并重新渲染页面时出现Rails,显示未保存的属性和错误

  21. 21

    错误地删除了/ boot文件夹并重新启动

  22. 22

    试图在我的“刷新”存储过程中删除并重新创建索引,但出现错误

  23. 23

    删除并重新插入GeoFire位置以触发onKeyExited和onKeyEntered不起作用

  24. 24

    DataTable删除列并重新排序列

  25. 25

    删除并重新添加功能javascript?

  26. 26

    删除并重新排列arraylist

  27. 27

    如何删除nginx并重新激活Apache?

  28. 28

    删除并重新添加功能javascript?

  29. 29

    如何删除nginx并重新激活Apache?

热门标签

归档