0

Ich versuche, durch Ausführen des folgenden Code ein einfaches Array von Objekten im persistenten Speicher zu speichern:Archive Arrays im DocumentDirectory in Swift

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

Doch wenn ich das wieder Datum wie in dem Druck Code finde ich nil.
Umgekehrt, wenn ich das CachesDirectory verwenden das Array ist bald nach der Wiederherstellung gut,
aber wenn ich die App erneut öffnen und versuche, die Daten zu laden, ist es verloren. Was ist der richtige Weg, um Daten dauerhaft zu speichern?

Antwort

0

Ich denke, das Problem ist, dass Sie URLByAppendingPathExtension verwenden, wenn Sie URLByAppendingPathComponent verwenden sollten. Die "Pfaderweiterung" ist die Dateierweiterung, also ist Ihre archivePath "~/Documents.meditations.archive". Möglicherweise arbeitet es vorübergehend mit dem CachesDirectory, weil es die Daten irgendwo in eine temporäre Datei schreibt oder sie einfach aus dem Speicher liest. Dies sollte es beheben:

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