2017-05-26 119 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是一個隱藏文件夾。 –

相關問題