我正在尝试通过执行以下代码在持久性内存中保存对象的简单数组:

let fileManager=NSFileManager()
     let urls = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)

     if urls.count>0{

         let localDocumentsDirectory=urls[0]
         let archivePath=localDocumentsDirectory.URLByAppendingPathExtension("meditations.archive")
         NSKeyedArchiver.archiveRootObject(self.meditationsArray, toFile: archivePath.path!)
         let restored=NSKeyedUnarchiver.unarchiveObjectWithFile(archivePath.path!)

         print("restored \(restored)")
     }
}


但是,当我按代码打印恢复的日期时,发现为零。
相反,如果我使用CachesDirectory,则阵列恢复后很快就可以了,
但是当我重新打开该应用程序并尝试加载数据时,它会丢失。持久保存数据的正确方法是什么?

最佳答案

我认为问题是您应该使用URLByAppendingPathExtension时正在使用URLByAppendingPathComponent。 “路径扩展名”是文件扩展名,因此您的archivePath是“〜/ Documents.meditations.archive”。它可能暂时与CachesDirectory一起使用,因为它会将数据放入某个地方的临时文件中,或者只是从内存中读取它。这应该解决它:

let fileManager = NSFileManager()
let documentDirectoryUrls = fileManager.URLsForDirectory(.DocumentDirectory, .UserDomainMask)

if let documentDirectoryUrl = documentDirectoryUrls.first {
    let fileUrl = documentDirectoryUrl.URLByAppendingPathComponent("meditations.archive")

    // Also, take advantage of archiveRootObject's return value to check if
    // the file was saved successfully, and safely unwrap the `path` property
    // of the URL. That will help you catch any errors.
    if let path = fileUrl.path {
        let success = NSKeyedArchiver.archiveRootObject(meditationArray, toFile: path)

        if !success {
            print("Unable to save array to \(path)")
        }
    } else {
        print("Invalid path")
    }
} else {
    print("Unable to find DocumentDirectory for the specified domain mask.")
}

09-16 05:47