2017-05-26 73 views
1

我试图保存一连串的声音,我迅速连接在一起,然后加载它们。但是,所有数据都可以正确保存,但是当我尝试加载数据时,数据所保存的所有属性都不再存在,但它仍将存储的数据视为现有数据,而没有保存时​​的任何属性。我很困惑为什么会发生这种情况为什么我保存的用户数据不能在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 
} 
} 
+0

副作用:用户默认是*不是一个好地方*来保存这样的应用程序资源。您应该将它们包含在应用程序包中,如果它们从未更改,或者在应用程序支持文件夹中(如果它们的话)。 –

+0

我是一个通过swift进行文件操作的新手段,你能否解释为什么它不是很好的做法来保存到默认值,这样我就可以理解 –

+0

对于一个系统来说太多的数据是为了容纳一小部分表示设置的信息。在iCloud同步的应用程序中,如此大量的数据会大大降低同步速度。应用程序启动时间也会受到影响。 –

回答

1

你确定你的数据是真的保存了吗?你有没有查看偏好PLIST文件来验证?您的日志语句不会真正验证此假设。

此外,您的SoundNSCoding兼容吗?您是否实施协议来归档/取消归档每个属性?如果没有(如果你声明了合规性但不处理你的类的自定义属性),它们将永远不会被写入(或读取),并且你的未归档实例将具有默认值。

+0

i don甚至没有喜欢plist只有info.plist,但我怎么会让我的类nscoding兼容,因为我绝对没有这样做 –

+0

你有一些阅读要做。首选项存储在〜/ Library/Preferences中(其中〜是您的主文件夹)。注〜/ Library是一个隐藏文件夹。 –

相关问题