为什么我保存的用户数据不能在swift中正确加载?
我试图保存一连串的声音,我迅速连接在一起,然后加载它们。但是,所有数据都可以正确保存,但是当我尝试加载数据时,数据所保存的所有属性都不再存在,但它仍将存储的数据视为现有数据,而没有保存时的任何属性。我很困惑为什么会发生这种情况为什么我保存的用户数据不能在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
}
}
你确定你的数据是真的保存了吗?你有没有查看偏好PLIST文件来验证?您的日志语句不会真正验证此假设。
此外,您的Sound
类NSCoding
兼容吗?您是否实施协议来归档/取消归档每个属性?如果没有(如果你声明了合规性但不处理你的类的自定义属性),它们将永远不会被写入(或读取),并且你的未归档实例将具有默认值。
i don甚至没有喜欢plist只有info.plist,但我怎么会让我的类nscoding兼容,因为我绝对没有这样做 –
你有一些阅读要做。首选项存储在〜/ Library/Preferences中(其中〜是您的主文件夹)。注〜/ Library是一个隐藏文件夹。 –
副作用:用户默认是*不是一个好地方*来保存这样的应用程序资源。您应该将它们包含在应用程序包中,如果它们从未更改,或者在应用程序支持文件夹中(如果它们的话)。 –
我是一个通过swift进行文件操作的新手段,你能否解释为什么它不是很好的做法来保存到默认值,这样我就可以理解 –
对于一个系统来说太多的数据是为了容纳一小部分表示设置的信息。在iCloud同步的应用程序中,如此大量的数据会大大降低同步速度。应用程序启动时间也会受到影响。 –