2014-11-21 62 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