2014-11-21 51 views
0

我有一个应用程序周围,需要坚持的字典数组的数组。 我不能将它保存到NSUserDefaults。 我可能会使用CoreData,如果我有它的经验,但它似乎矫枉过正,我只需要在启动时收集数据,并保存一次关闭。如何保存和检索字典数组的数组

所以我想弄清楚如何写这个保存到一个plist文件(如果可能的话)。 并在应用程序启动时检索它。

数据:

// Declare var 
var recordingsDictionaryArray = [[:]] 
// Populate many times during app use 
recordingsDictionaryArray.insert(["name":saveRecordingField.stringValue, "date":NSDate(), "path":recorder.url], atIndex: 0) 

所以词典包含字符串的NSDate的混合物,而NSURL

可这在我的applicationSupport文件被保存到一个plist文件..? 希望不会在启动时保存并重新构建它时将其分开。

我正在尝试一个例子,但我不能得到它的工作,如果我没有参考[0]的数据变种。如果我只是说VAR数据= recordingsDictionaryArray我得到的错误:

func applicationWillTerminate(aNotification: NSNotification) { 
    // add some dummy content to the empty recordingsDictionaryArray 
    recordingsDictionaryArray.insert(["name":"Recording One", "date":NSDate(), "path":"dummy path"], atIndex: 0) // dummy content 
    recordingsDictionaryArray.insert(["name":"Recording Two", "date":NSDate(), "path":"another dummy path"], atIndex: 0) // dummy content 
    recordingsDictionaryArray.insert(["name":"Recording Three", "date":NSDate(), "path":"final dummy path"], atIndex: 0) // dummy content 

    // check the count 
    var thecount = recordingsDictionaryArray.count 
    println(thecount) 



    var data = recordingsDictionaryArray[0] // if i do not add reference to item [0] data errors below 
    var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String 
    var path = paths.stringByAppendingPathComponent("data.plist") 
    var fileManager = NSFileManager.defaultManager() 
    if (!(fileManager.fileExistsAtPath(path))) 
    { 
     var bundle: NSString = NSBundle.mainBundle().pathForResource("recordings", ofType: "plist")! 
     fileManager.copyItemAtPath(bundle, toPath: path, error:nil) 
    } 
    data.objectForKey(data) 
    data.writeToFile(path, atomically: true) 
    // I only get "Recording 3" saved to the plist 
} 

再回答下面的1: 我觉得我是接近NSUserDefaults的与到达那里,但不知道如何让mutableRetrievedDictionary回recordingsDictionaryArray为它是在保存之前。

// save 
    NSUserDefaults.standardUserDefaults().setObject(recordingsDictionaryArray, forKey: "recordingsArray") 
    NSUserDefaults.standardUserDefaults().synchronize() 



    // retrieve 
    var mutableRetrievedDictionary: AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("recordingsArray")?.mutableCopy() 
+0

请注意,从NSUserDefaults返回的数据总是不可变的,需要再次更改为mutable。 – AMAN77 2014-11-21 15:07:04

回答

0

您绝对可以将其保存到NSUserDefaults。 试试这个:

let standard = NSUserDefaults.standardUserDefaults() //Helps when you call it a lot 
var recordingsDictionaryArray : NSMutableArray! 

//SAVE 
standard.setObject("anyObject", forKey: "myKey") 
standard.synchronize() 

//RETRIEVE 
recordingsDictionaryArray = standard.objectForKey("myKey") as NSMutableArray 
//Force the object called back to be mutable again 
+0

非常感谢您的支持,我认为我正在与NSUserDefaults进行一场失败的比赛。感觉我接近这样做,但不能完全胜任。请参阅我的问题底部的更新。谢谢。 – 2014-11-21 11:40:34

+0

如果您正在回答问题,请考虑添加包含解决方案的实际代码。否则你的答案可能会被删除 – 2014-11-21 11:43:34

0

很多半受过教育的试错之后,我发现了一个解决方案,对我来说在这种情况下工作,使用NSUserDefaults的:

func applicationWillTerminate(aNotification: NSNotification) { 
    // add some dummy content to the empty recordingsDictionaryArray 
    recordingsDictionaryArray.insert(["name":"Recording One", "date":NSDate(), "path":"dummy path"], atIndex: 0) // dummy content 
    recordingsDictionaryArray.insert(["name":"Recording Two", "date":NSDate(), "path":"another dummy path"], atIndex: 0) // dummy content 
    recordingsDictionaryArray.insert(["name":"Recording Three", "date":NSDate(), "path":"final dummy path"], atIndex: 0) // dummy content 


    // Save to NSUserDefaults 
    NSUserDefaults.standardUserDefaults().setObject(recordingsDictionaryArray, forKey: "recordingsArray") 
    NSUserDefaults.standardUserDefaults().synchronize() 

取回数据

func applicationDidFinishLaunching(aNotification: NSNotification) { 

    recordingsDictionaryArray = NSUserDefaults.standardUserDefaults().objectForKey("recordingsArray")?.mutableCopy() as Array 
相关问题