0
NSKeyedArchiver.archiveRootObject(<#rootObject: AnyObject#>, toFile: <#String#>)

仅在第一次返回 true。每次我调用它时,该方法都会返回 false。

我读了一些 SO,一些帖子说我不能以这种方式重写数据。但是,我尝试了:

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

它仍然没有帮助。

我做了什么:

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

我错过了一些东西,因为我已经在我的上一个应用程序中完成了这个并且它工作正常`

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。

欢迎任何帮助和代码更正。

4

2 回答 2

1

由于您放在这里的代码不包含saveDataArrayorsaveDataObject所以我判断您已经手动维护了存档对象的路径。这就是事情出错的地方。命名为 NSKeyedArchiver 的方法archiveRootObject可以自动维护归档器文件路径。

在苹果的杜库梅

通过将基于给定对象的对象图编码为数据对象,将其归档,然后以原子方式将结果数据对象写入给定路径的文件,并返回一个布尔值,指示操作是否成功。

SO中还有一个问题可能会对您有所帮助。

于 2016-03-17T09:00:55.217 回答
0

我在这个很好的例子中遵循了苹果的说明:Persist Data 但是我遇到了你在我的 AppleTV 应用程序中描述的同样的问题。最后,我更改了 CacheDirectory 的 .Documents 目录,它运行良好。

static let DocumentsDirectorio = NSFileManager().URLsForDirectory(.CachesDirectory, inDomains: .UserDomainMask).first!
于 2016-09-02T10:08:43.840 回答