Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何保存和检索字典数组数组_Arrays_Dictionary_Swift_Plist - Fatal编程技术网

Arrays 如何保存和检索字典数组数组

Arrays 如何保存和检索字典数组数组,arrays,dictionary,swift,plist,Arrays,Dictionary,Swift,Plist,我有一个应用程序围绕的字典数组,需要持久化。 我无法将此保存到NSUserDefaults。 如果我有使用CoreData的经验,我可能会使用它,但这似乎有些过分,我只需要在启动时收集一次数据,然后在关闭时保存一次 因此,我试图找出如何在保存时将其写入plist文件(如果可能的话)。 并在应用程序启动时检索它 数据: // Declare var var recordingsDictionaryArray = [[:]] // Populate many times during app use

我有一个应用程序围绕的字典数组,需要持久化。 我无法将此保存到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的混合

是否可以将其保存到my applicationSupport文件夹中的plist文件中。。? 希望不会在保存时将其拆分,并在发布时重新构建

我正在尝试一个示例,但如果我不引用[0]数据变量,则根本无法使其工作。如果我只说var data=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()

您完全可以将其保存到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

在经历了大量半教育式的尝试和错误之后,我找到了一个在本例中适用的解决方案,使用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

谢谢你的提醒,我还以为我和你的战斗是失败的呢。A我觉得我已经接近这样做了,但还不能完全做到。请参阅我问题底部的更新。如果您正在回答问题,那么考虑添加包含解决方案的实际代码。否则您的答案可能会被删除。请注意,当从NSUserDefaults返回的数据总是不可变的,需要再次更改为可变的。