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

只在第一次返回true。每次我調用它時,該方法都返回false。如果我想覆蓋數據,NSKeyedArchiver.archiveRootObject返回「false」,爲什麼?

我讀了一些SO,有些帖子說我不能用這種方式重寫數據。但是,我試過:

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

它仍然沒有幫助。

我所做的:

  1. 檢查了所有我的模型文件的NSCoding協議
  2. 檢查了所有我required init(coder aDecoder: NSCoder)func encodeWithCoder(aCoder: NSCoder)

我失去了一些東西,因爲我已經在這樣做了我最後的應用程序,它的工作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 
     } 
    ` 

我正在使用Xcode 6.4和Swift 1.2。

任何幫助&代碼更正是受歡迎的。

回答

1

由於您放在這裏的代碼不包含saveDataArraysaveDataObject的調用,所以我判斷您已手動維護存檔對象的路徑。 這是發生問題的地方。名爲archiveRootObject的NSKeyedArchiver的方法可以自動維護存檔器文件路徑。

在蘋果公司的doucumet

檔案通過編碼成一個數據對象在給定對象爲根的對象圖然後將得到的數據對象原子寫入到在給定的路徑中的文件,並返回一個布爾值表明操作是否成功。

並且在SO另一個問題可以幫助你。

+0

我會盡快測試它。泰 –

0

我在這個好例子中遵循了蘋果指令:Persist Data 但是我遇到了與我的AppleTV應用程序描述的相同的問題。最後,我更改了CacheDirectory的文檔目錄,並且它運行良好。

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