1

次のコードを実行して、オブジェクトの単純な配列を永続メモリに保存しようとしています。

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)")
     }
}

それでも、コードのように復元された日付を出力すると、nil が見つかります。
逆に、CachesDirectory を使用すると、配列はすぐに正常に復元されます
が、アプリを再度開いてデータを読み込もうとすると、配列が失われます。データを永続的に保存する正しい方法は何ですか?

4

2 に答える 2

0

問題は、 を使用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.")
}
于 2016-04-17T23:53:18.530 に答える