ios FileManager在重建应用程序时丢失存储的数据

时间:2018-01-24 21:59:31

标签: ios swift nsfilemanager

我正在尝试将图像存储在应用程序的文档文件夹中,因此用户可以在以后的任何时间检索它们。这是我存储它们的代码:

func store(_ image: UIImage) -> String {
    let imageName = "\(Date().timeIntervalSince1970)"
    let imagePath = "\(documentasPath)/\(imageName).png"

    let imageData = UIImagePNGRepresentation(image)

    fileManager.createFile(atPath: imagePath, contents: imageData, attributes: nil)

    return imagePath
}

这是我从存储中检索图像的代码:

func retrieveImage(from path: String) -> UIImage? {

    guard fileManager.fileExists(atPath: path) else {
        return nil
    }

    return UIImage(contentsOfFile: path)
}

似乎工作正常,除非我从xcode重建应用程序。然后我存储的所有图像都消失了(虽然我存储的指向它们的所有路径仍然存在且正确)。

这是默认文件管理器的一些行为吗?有没有办法避免这种情况发生?我希望手动删除图像或者在卸载应用程序时删除图像。

由于

2 个答案:

答案 0 :(得分:2)

问题是您存储的是绝对路径。您无法这样做,因为您的应用是沙盒,这意味着(部分)可以更改Documents文件夹的URL。只存储文档 name ,每次要保存或写入文档时,再次计算Documents文件夹的路径并附加文档名称并使用该文件名结果作为你的道路。

答案 1 :(得分:1)

更改为

 func store(_ image: UIImage) -> String {

     let imageName = "\(Date().timeIntervalSince1970)"

     let documentsUrl = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])

     var imagePath = documentsUrl.appendingPathComponent("\(imageName).png")

     let imageData = UIImagePNGRepresentation(image)

     fileManager.createFile(atPath: imagePath, contents: imageData, attributes: nil)

     return imagePath
   }


  func retrieveImage(from path: String) -> UIImage? {

      guard fileManager.fileExists(atPath: path) else {
          return nil
      }

      return UIImage(contentsOfFile: path)
  }