【发布时间】:2015-12-02 17:21:58
【问题描述】:
我对 Swift 2.0 中的 NSUserDefault 有一点问题。
我正在做以下操作:
let standardUserDefaults = NSUserDefaults.standardUserDefaults()
standardUserDefaults.removeObjectForKey(key)
NSUserDefaults.standardUserDefaults().synchronize()
or
standardUserDefaults.synchronize()
我的问题是,如果我这样做后关闭应用程序,密钥不会被删除。
之前我没有synchronize(),看了论坛才知道,如果需要立即执行,则需要强制执行,而不是让苹果定期执行。
我还在applicationDidEnterBackground 和applicationDidBecomeActive 中添加了synchronize() 以便尝试查看,但它仍然不起作用。
所以很奇怪,如果我在执行操作后等待,然后检查,密钥正在被删除。
如果我在执行操作后等待或不等待,那么只需强制退出应用程序(向上滑动应用程序),当我加载应用程序时,密钥仍然存在,即使正在调用 applicationDidEnterBackground 和 applicationDidBecomeActive 并且synchronize() 正在被调用。
如果我只是将应用程序放在后台,同样的行为:-/
我不确定我在这里缺少什么?
好的,这里有更多细节:
好的,所以我在 ViewController 中执行操作:
@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" 正在打印。
然后我调用 delete 方法:
let standardUserDefaults = NSUserDefaults.standardUserDefaults()
standardUserDefaults.removeObjectForKey("TEST2")
然后我将应用程序发送回后台,并重新唤醒应用程序,我在同一applicationDidBecomeActive 中检查断点。正在打印值...我使用的是手机而不是模拟器.. . 它只是没有意义。
我也尝试代替删除来代替:
NSUserDefaults.standardUserDefaults().setObject(
NSKeyedArchiver.archivedDataWithRootObject("TEST 3"), forKey: "TEST2").
在applicationDidBecomeActive 中,输出为"TEST 1" .... 似乎没有应用修改:-O
【问题讨论】:
-
你在哪里实现该代码?
-
是模拟器先缓存内存的问题。它只发生在 xcode 中,不应该发生在设备上。你检查过设备吗?
-
你好,是的,我也在读到这个,不幸的是,它也发生在我的设备上:-(我通过 xCode 7.1 将构建直接推送到我的手机。
-
@julien 您需要显示其余代码及其实现位置。顺便说一句,调用同步它是不需要的,也不会有所作为。
-
@julien 您可以尝试一些事情 1. 检查您用于删除和访问的密钥是否相同 2. 您可能在其他地方重新引入了密钥的值代码库。尝试将 NSUserDefaults 操作包装在一个类中,以便您可以轻松跟踪访问 3. 尝试设置硬编码的垃圾值,而不是删除键的对象,并查看在加载应用程序时是否看到相同的垃圾值。
标签: ios swift swift2 nsuserdefaults