Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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
为什么我保存的用户数据不能在swift中正确加载?_Swift_Nsuserdefaults - Fatal编程技术网

为什么我保存的用户数据不能在swift中正确加载?

为什么我保存的用户数据不能在swift中正确加载?,swift,nsuserdefaults,Swift,Nsuserdefaults,我试图保存一组声音,这些声音是我在swift中连接在一起的,然后再加载它们。但是,所有数据都正确地保存了,但是当我尝试加载它时,数据保存的所有属性都不再存在,但它仍然将数据视为存在,而保存时没有任何属性。我不明白为什么会这样 struct saveSound{ static func save(newSound: mergedSound = mergedSound()){ if newSound.soundName == "" || newSound.soundUrl == "" {

我试图保存一组声音,这些声音是我在swift中连接在一起的,然后再加载它们。但是,所有数据都正确地保存了,但是当我尝试加载它时,数据保存的所有属性都不再存在,但它仍然将数据视为存在,而保存时没有任何属性。我不明白为什么会这样

  struct saveSound{
static func save(newSound: mergedSound = mergedSound()){
    if newSound.soundName == "" || newSound.soundUrl == "" { print("no new data") ; return}
    var sounds = loadSounds.getSounds()
    sounds.append(newSound)
    let archive = NSKeyedArchiver.archivedData(withRootObject: sounds)
    for soun in sounds{

        print(soun.soundName," - saved")
    }
    UserDefaults.standard.set(archive, forKey: "SavedSounds")
}
 }
 struct loadSounds {

static func getSounds() -> [mergedSound]{

    var sounds = [mergedSound]()
    var data = Data()
    if UserDefaults.standard.object(forKey: "SavedSounds") as? Data != nil {
        print("data exists")
        data = UserDefaults.standard.object(forKey: "SavedSounds") as! Data
        sounds =  NSKeyedUnarchiver.unarchiveObject(with: data) as! [mergedSound]
        for souns in sounds{
            print(souns.soundName,sounds.count, " - loaded")
        }

    }
    return sounds
}
}

你确定你的数据确实保存了吗?您是否查看了preferences PLIST文件以进行验证?您的log语句并没有实际验证这个假设


另外,您的
声音
NSCoding
是否符合要求?您是否实施了存档/取消存档每个属性的协议?否则(如果您声明遵从性但不处理类的自定义属性),它们将永远不会被写入(或读取),您的未归档实例将具有默认值

旁白:用户默认值不是这样保存应用程序资源的好地方。如果它们从未更改,你应该将它们包括在应用程序包中,如果它们更改了,则应将它们包括在应用程序支持文件夹中。我对通过swift进行文件操作有点陌生,你能解释一下为什么保存为默认值不是一种好做法吗,这样我就可以理解对于一个系统来说太多的数据了,而这个系统的目的是保存表示设置的少量信息。在iCloud的同步应用程序中,如此巨大的数据量会大大降低同步速度。应用程序启动时间也会受到影响。我甚至没有首选项plist lol only info.plist的可能重复项,但我如何使我的类符合nscoding,因为我肯定没有这样做。你有一些阅读要做。首选项存储在~/Library/Preferences中(其中~是您的主文件夹)。注意~/Library是一个隐藏文件夹。