2015-11-08 3 views
0
NSKeyedArchiver.archiveRootObject(<#rootObject: AnyObject#>, toFile: <#String#>) 

Renvoie true la première fois. Chaque fois que je l'appelle, la méthode retourne false.NSKeyedArchiver.archiveRootObject renvoie "false" si je veux écraser des données, pourquoi?

J'ai lu certains SO, certains messages ont dit que je ne peux pas réécrire des données de cette façon. Cependant, j'ai essayé:

NSFileManager.defaultManager().removeItemAtPath(path, error: nil) 

et cela n'a toujours pas aidé.

Ce que je l'ai fait:

  1. cochés tous mes fichiers de modèle pour le protocole NSCoding
  2. vérifié toutes mes required init(coder aDecoder: NSCoder) et func encodeWithCoder(aCoder: NSCoder)

je manque quelque chose, puisque je l'ai fait dans mon dernière application et il a travaillé fla

import Foundation 

    private let ON_DISK_DATA_DICTIONARY = "savedDataPathsOnDisk" 
    private let _WBMAccessDataOnDiskMShared = WBMAccessDataOnDiskM() 
    private var dataDirectories:NSArray! = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
    private var dataDirectoryURL:NSURL! = NSURL(fileURLWithPath: dataDirectories.objectAtIndex(0) as! String, isDirectory: true) 
    private var dataDirectoryPath:String! = dataDirectoryURL.path! 

    let FILE_FORMAT = ".archive" 

    class WBMAccessDataOnDiskM: NSObject 
    { 
     class var sharedData: WBMAccessDataOnDiskM 
     { 
      return _WBMAccessDataOnDiskMShared 
     } 

     private var dataAndPathDictionary = [String:String]() 

     func getDataAndPathDictionary() -> [String:String] 
     { 
      return self.dataAndPathDictionary 
     } 

     func addDataAndPathToDictionary(data:String ,path:String) 
     { 
      if !checkIfDataAllreadyExists(data) 
      { 
       let fullPath    = createFullDataPath(path) 
       dataAndPathDictionary[data] = fullPath 
       NSUserDefaults.standardUserDefaults().setObject(dataAndPathDictionary, forKey: ON_DISK_DATA_DICTIONARY) 
      } 
     } 

     func checkIfDataIsAvailable(dataPathComponent:String) -> (Bool,String) 
     { 
      var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! String 
      var dataPath = paths.stringByAppendingPathComponent(dataPathComponent) 
      var checkValidation = NSFileManager.defaultManager() 

      println(dataPathComponent) 

      if (checkValidation.fileExistsAtPath(dataPath)) 
      { 
       return (true,dataPath) 
      } 
      else 
      { 
       return (false,"") 
      } 
     } 

     func checkForDataOnDisk() -> Bool 
     { 
      let dataDict = NSUserDefaults.standardUserDefaults().objectForKey(ON_DISK_DATA_DICTIONARY) as? [String:String] 

      if dataDict == nil 
      { 
       return false 
      } 
      else 
      { 
       dataAndPathDictionary = dataDict! 
       return true 
      } 
     } 

     private func checkIfDataAllreadyExists(data:String) -> Bool 
     { 
      let keys = self.dataAndPathDictionary.keys.array 
      if contains(keys, data) 
      { 
       return true 
      } 
      return false 
     } 

     private func createFullDataPath(path:String) -> String 
     { 
      var fullPathURL = dataDirectoryURL.URLByAppendingPathComponent(path + FILE_FORMAT) 
      return fullPathURL.path! 
     } 

     func saveDataArray(data:[AnyObject], path:String) 
     { 
      NSFileManager.defaultManager().removeItemAtPath(path, error: nil) 

      if NSKeyedArchiver.archiveRootObject(data, toFile: path) 
      { 
       // SAVING 
       println(" Saving data ARRAY ") 
      } 
      else 
      { 
       println(" NOT saving data ARRAY ") 
      } 
     } 

     func saveDataObject(dataObject:AnyObject, path:String) 
     { 
      if NSKeyedArchiver.archiveRootObject(dataObject, toFile: path) 
      { 
       println(" Saving data OBJECT ") 
      } 
      else 
      { 
       println(" NOT saving data OBJECT ") 
      } 
     } 

     // dataFromDisk = NSKeyedUnarchiver.unarchiveObjectWithFile(pathForNews) as? [AnyObject] 
     func loadDataArray(path:String) -> [AnyObject]? 
     { 
      var dataArrayFromDisk: [AnyObject]? 
      dataArrayFromDisk = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? [AnyObject] 

      return dataArrayFromDisk 
     } 

     func loadDataObject(path:String) -> AnyObject? 
     { 
      var dataObjectFromDisk: AnyObject? 
      dataObjectFromDisk = NSKeyedUnarchiver.unarchiveObjectWithFile(path) 
      return dataObjectFromDisk 
     } 

     func getNewsDataLanguagePath() -> String 
     { 
      var currentOSLanguage = LOCALIZATION.currentOsLanguage 
      currentOSLanguage  = currentOSLanguage.substringToIndex(2) 
      if currentOSLanguage == "de" 
      { 
       return ON_DISK_CONTENT_DE 
      } 
      else if currentOSLanguage == "en" 
      { 
       return ON_DISK_CONTENT_ENG 
      } 
      return ON_DISK_CONTENT_ENG 
     } 
    ` 

J'utilise Xcode 6.4 et Swift 1.2.

Toute aide & correction de code est la bienvenue.

Répondre

1

En raison du code que vous mettez ici ne contient pas l'appel de saveDataArray ou saveDataObject donc je juge que vous avez maintenir le chemin d'un objet archivé manuellement. C'est là que la chose a mal tourné. La méthode de NSKeyedArchiver nommée archiveRootObject peut automatiquement gérer le chemin du fichier d'archivage.

Dans le doucumet d'Apple

Archives un graphe d'objet ancré à un objet donné par le codage dans un objet de données puis écrit atomiquement l'objet de données résultant d'un fichier à un chemin donné, et renvoie une valeur booléenne cela indique si l'opération a réussi.

Et il y a une autre question dans SO peut vous aider.

+0

Je vais le tester dès que possilbe. Ty –

0

J'ai suivi les instructions Apple dans ce bon exemple: Persist Data Mais j'ai eu le même problème que vous décrivez avec mon application pour AppleTV. A la fin, je change le répertoire .Documents pour CacheDirectory et ça marche bien.

static let DocumentsDirectorio = NSFileManager().URLsForDirectory(.CachesDirectory, inDomains: .UserDomainMask).first!