iOS 重启后尝试从本地路径加载图像失败

Trying to load images from local path fails after restart in iOS

我正在使用此代码在设备上存储图像(使用 Swift 1.2 / iOS 8)

func saveImageLocally(imageData:NSData!) -> String{
    let time =  NSDate().timeIntervalSince1970
    let fileManager = NSFileManager.defaultManager()
    let dir = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0].stringByAppendingPathComponent(subDirForImage) as String
    if !fileManager.fileExistsAtPath(dir) {
        var error: NSError?
        if !fileManager.createDirectoryAtPath(dir, withIntermediateDirectories: true, attributes: nil, error: &error) {
            println("Unable to create directory: \(error)")
            return ""
        }
    }

    let path = dir.stringByAppendingPathComponent("spot\(Int(time)).png")

    imageData.writeToFile(path, atomically: true)
    println(UIImage(contentsOfFile: path))
    return path
}

效果很好,因为如果我观察模拟器的文件系统,我可以在 println 和 Finder 中看到图像。

在模拟器中重新启动我的应用程序后(或 iPhone,这是相同的行为)我尝试这样读取图像:

func loadImageFromLocalStore(path: String) -> UIImage{
    if(!path.isEmpty){
        let image = UIImage(contentsOfFile: path)
        if(image != nil){
            return image!;
        }
    }
    return UIImage(named: "noImage.png")!
}

但是这里无法获取图像。它总是零。但是:路径没有改变,而且我仍然在文件系统中看到图像。

明白了,我的问题是我保存的完整路径似乎是错误的。最好只保存图像名称。

这是现在的保存方法

 func saveImageLocally(imageData:NSData!) -> String{
    let time =  NSDate().timeIntervalSince1970
    let fileManager = NSFileManager.defaultManager()
    let dir = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0].stringByAppendingPathComponent(subDirForImage) as String

    if !fileManager.fileExistsAtPath(dir) {
        var error: NSError?
        if !fileManager.createDirectoryAtPath(dir, withIntermediateDirectories: true, attributes: nil, error: &error) {
            println("Unable to create directory: \(error)")
            return ""
        }
    }

    let pathToSaveImage = dir.stringByAppendingPathComponent("spot\(Int(time)).png")

    imageData.writeToFile(pathToSaveImage, atomically: true)

    return "spot\(Int(time)).png"
}

这是读取方法

func loadImageFromLocalStore(imageName: String) -> UIImage{
    let fileManager = NSFileManager.defaultManager()
    let dir = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0].stringByAppendingPathComponent(subDirForImage) as String

    let path = dir.stringByAppendingPathComponent(imageName)

    if(!path.isEmpty){
        let image = UIImage(contentsOfFile: path)
        println(image);
        if(image != nil){
            return image!;
        }
    }

    return UIImage(named: "noImage.png")!
  }

最佳 克里斯蒂安