【问题标题】:iOS 9 - NSUserDefault Not SetiOS 9 - 未设置 NSUserDefault
【发布时间】:2015-12-02 17:21:58
【问题描述】:

我对 Swift 2.0 中的 NSUserDefault 有一点问题。

我正在做以下操作:

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

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

我的问题是,如果我这样做后关闭应用程序,密钥不会被删除。

之前我没有synchronize(),看了论坛才知道,如果需要立即执行,则需要强制执行,而不是让苹果定期执行。

我还在applicationDidEnterBackgroundapplicationDidBecomeActive 中添加了synchronize() 以便尝试查看,但它仍然不起作用。

所以很奇怪,如果我在执行操作后等待,然后检查,密钥正在被删除。 如果我在执行操作后等待或不等待,那么只需强制退出应用程序(向上滑动应用程序),当我加载应用程序时,密钥仍然存在,即使正在调用 applicationDidEnterBackgroundapplicationDidBecomeActive 并且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


【解决方案1】:

试着去做

NSUserDefaults.standardUserDefaults().registerDefaults(registrationDictionary)

根据NSUserDefaults Class Reference 的要求。

您需要在每次应用程序启动时调用此方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    相关资源
    最近更新 更多