相关疑难解决方法(0)

如何在Swift中使用KVO for UserDefaults?

我正在重写应用程序的一部分,并找到了这段代码:

fileprivate let defaults = UserDefaults.standard

func storeValue(_ value: AnyObject, forKey key:String) {
    defaults.set(value, forKey: key)
    defaults.synchronize()

    NotificationCenter.default.post(name: Notification.Name(rawValue: "persistanceServiceValueChangedNotification"), object: key)
}
func getValueForKey(_ key:String, defaultValue:AnyObject? = nil) -> AnyObject? {
    return defaults.object(forKey: key) as AnyObject? ?? defaultValue
}
Run Code Online (Sandbox Code Playgroud)

当CMD点击该行时,defaults.synchronize()我看到synchronize计划已弃用.这是在代码中写的:

/*!
     -synchronize is deprecated and will be marked with the NS_DEPRECATED macro in a future release.

     -synchronize blocks the calling thread until all in-progress set operations have completed. This is no longer necessary. Replacements for …
Run Code Online (Sandbox Code Playgroud)

key-value-observing foundation ios swift

16
推荐指数
3
解决办法
6718
查看次数

NSUserDefaultsDidChangeNotification和Today Extensions

我正在开发一个带有Today Extension的iPhone应用程序.该应用程序有一个模型模块,可以加载/保存到NSUserDefaults.由于我希望主要应用和扩展程序都可以使用此信息,因此我使用了一个应用程序组:

let storage = NSUserDefaults(suiteName: "group.etc.etc.etc...")
Run Code Online (Sandbox Code Playgroud)

应用程序和扩展程序都可以毫无问题地访问信息.

主应用程序偶尔可能会创建一个本地通知以呈现给用户.该通知有两个与之关联的操作(UIUserNotificationAction).其中一个操作会触发一些代码在主应用程序的后台运行.该代码更改NSUserDefaults信息并触发同步.我的代码是这样的:

func application(application: UIApplication, handleActionWithIdentifier id: String?, forLocalNotification not: UILocalNotification, completionHandler: () -> ()) {
    // Interact with model here
    // New information gets saved to NSUserDefaults
    userDefaultsStorage.synchronize()
    completionHandler()
}
Run Code Online (Sandbox Code Playgroud)

现在,在今天外线.我自然会观察对信息所做的任何更改,NSUserDefaults以便我可以在窗口小部件上重新加载界面:

override func viewDidLoad() {
    super.viewDidLoad()

    // ...

    NSNotificationCenter.defaultCenter().addObserverForName(NSUserDefaultsDidChangeNotification, object: nil, queue: NSOperationQueue.mainQueue()) { _ in
        self.reload()
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,这是我的问题:

  1. 主应用程序安排UILocalNotification.我打开今天的视图,看看我今天的小部件.

  2. 当通知触发时,屏幕顶部会出现一个横幅.

  3. 我在那个横幅上向下滑动以显示这两个动作,然后我选择我之前提到的那个动作(今天的小部件仍在现场和屏幕上).

我知道这个动作在后台运行正常,并且正在对信息进行更改NSUserDefaults.

但是,即使今天的窗口小部件一直处于活动状态并始终显示在屏幕上,也不会触发重新加载操作.经过进一步调查,我可以证实,NSUserDefaultsDidChangeNotification …

nsuserdefaults ios swift ios8-today-widget today-extension

15
推荐指数
1
解决办法
5804
查看次数

NSUserDefaults和KVO问题

我在我的应用程序中使用NSUserDefaults,我希望在更改特定值时收到通知.为此,我在viewDidLoad中添加了以下行:

NSUserDefaults *settings = [NSUserDefaults standardUserDefaults];
[settings synchronize];
[settings addObserver:self forKeyPath:@"pref_server" options:NSKeyValueObservingOptionNew context:NULL];
Run Code Online (Sandbox Code Playgroud)

以及要通知的方法:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{

    NSLog(@"Change");

    NSUserDefaults *settings = [NSUserDefaults standardUserDefaults];
    if (object == settings && [keyPath isEqualToString:@"pref_server"])
    {
        NSLog(@"Server did change");
    }

}
Run Code Online (Sandbox Code Playgroud)

不幸的是,后者永远不会被调用... @"pref_server"是我在Root.plist中设置的项目标识符,在Settings.bundle中.我究竟做错了什么?

ios

9
推荐指数
2
解决办法
7249
查看次数

使用NSKeyValueObservation来观察UserDefaults中的值

我想使用Swift 4中基于块的KVO来观察值的变化UserDefaults.我能够观察的关键路径做到这一点WKWebViewestimatedProgress,但都没有成功与UserDefaults因为提供的关键路径是不是它的寻找.提供一个字符串是不够的(无法推断通用参数'值'),前缀\不够(表达式类型没有更多上下文是模糊的).创建KeyPath观察值的正确方法是UserDefaults什么?

observerToken = UserDefaults.standard.observe("myvalue") { (object, change) in
    //...
}
Run Code Online (Sandbox Code Playgroud)

key-value-observing ios swift swift4

7
推荐指数
1
解决办法
2644
查看次数