2015-12-02 38 views
2

我在Swift 2.0中遇到NSUserDefault的一個小問題。iOS 9 - NSUserDefault未設置

我做如下操作:

let standardUserDefaults = NSUserDefaults.standardUserDefaults() 
    standardUserDefaults.removeObjectForKey(key) 

    NSUserDefaults.standardUserDefaults().synchronize() 
or 
    standardUserDefaults.synchronize() 

我的問題是,如果我這樣做後,要關閉應用程序,關鍵是不能被刪除。

以前我沒有足夠的synchronize(),並期待在論壇上後,我意識到,你需要強制行動,如果你需要它立即,而不是讓蘋果做定期來完成。

我還在applicationDidEnterBackgroundapplicationDidBecomeActive中加入了synchronize(),以便嘗試查看,但仍然無效。

所以這很奇怪,如果我等我執行操作之後,檢查一下,鍵是否被刪除。 如果我在執行操作後等待或不執行操作,則強制退出應用程序(滑動應用程序),當我加載應用程序時,密鑰仍然存在,即使調用了applicationDidEnterBackgroundapplicationDidBecomeActivesynchronize()被稱爲。 如果我只是在後臺應用程序,相同的行爲: -/

我不知道我在這裏失蹤?


好了,所以這裏更多的細節:

好了,所以我在一個視圖控制器執行的操作:

@IBAction func doneAction() { 

<DO SOME STUFF> 

let standardUserDefaults = NSUserDefaults.standardUserDefaults() 
standardUserDefaults.removeObjectForKey(key) 
NSUserDefaults.standardUserDefaults().synchronize() 

} 

沒什麼特別的: -/ 我不明白爲什麼,如果我收或放該應用程序在後臺操作是不是正在申請或丟棄?

它在視圖控制器實現的:

class reviewViewController: ViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UIScrollViewDelegate, State { 

編輯: @HongWei NSUserDefaults的將已經被包裹起來,並沒有什麼發送到應用程序的背景中調用了那個傢伙。

我試過:

NSUserDefaults.standardUserDefaults().setObject(
      NSKeyedArchiver.archivedDataWithRootObject("TEST 1"), forKey: "TEST2"). 

我然後把應用程序在之後的背景,然後我在applicationDidBecomeActive方法來檢查當我把應用程序備份:

if let data = NSUserDefaults.standardUserDefaults().objectForKey("TEST2") as? NSData, wrapper = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? String{ 
    print(wrapper); 
} 

我看到"TEST 1"感打印。

我然後調用刪除方法:

let standardUserDefaults = NSUserDefaults.standardUserDefaults() 
standardUserDefaults.removeObjectForKey("TEST2") 

我然後發送該應用回在後臺,並且喚醒應用備份,我檢查在斷點在同一applicationDidBecomeActive正在打印的值。 ..我正在使用我的手機,而不是模擬器......它只是沒有意義。

我也嘗試而不是刪除要做到這一點,而不是:

NSUserDefaults.standardUserDefaults().setObject(
      NSKeyedArchiver.archivedDataWithRootObject("TEST 3"), forKey: "TEST2"). 

applicationDidBecomeActive輸出"TEST 1" ....好像沒有施加修改:-O

+0

時間來調用這個方法你在哪裏執行的代碼? – LinusGeffarth

+1

@ julien你需要顯示你的代碼的其餘部分以及它的實現位置。 BTW調用同步它是不需要的,不會有所作爲。 –

+0

這是首先緩存內存的模擬器問題。它只發生在xcode中,不應該發生在設備上。你檢查過設備嗎? –

回答

0

嘗試要做

NSUserDefaults.standardUserDefaults().registerDefaults(registrationDictionary) 

,因爲它需要NSUserDefaults Class Reference

你需要在每個應用程序啓動