2015-12-02 35 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

你需要在每个应用程序启动