KVO与Swift中的共享NSUserDefaults

Raf*_*eek 5 ios7 swift ios8

我通过传达NSUserDefaults更改在主机应用程序及其扩展之间进行通信时遇到问题.

我初始化NSUserDefaults使用 init(suiteName:),使用该addObserver(...)方法添加KVO观察者并覆盖该方法 observeValueForKeyPath(...)但是observeValueForKeyPath(...)当我更改对应于观察的值时不调用该方法key.如果你帮我解决这个问题会很棒.

PS:此处套件名称是应用程序组名称,NSUserDefaults使用suiteName as group identifier将在应用程序组的私有区域内创建.

Dan*_*sko 2

从iOS 10开始,您可以在用户默认值上使用 KVO。

这个问题已经在这里得到了回答,所以我不会重新解决它。

旧答案(iOS 9 及更早版本)

简而言之,您不能使用 KVO 甚至 NSNotificationCenter 来在NSUserDefaults应用程序扩展和包含的应用程序之间传达更改。

Atomic Bird发表了一篇很棒的文章,探讨了协调通信的方式。特别是看看他对通信用户默认更改的分析很有趣:

应用程序/扩展通知的一个可能的替代方案是通过 CFNotificationCenterGetDarwinNotifyCenter 使用 Darwin 通知中心,这实际上有点像 NSDistributedNotificationCenter。Wade Spiers 在苹果的开发论坛网站上对此进行了一些讨论。

我说“可能”是因为我对这种方法能否继续发挥作用没有 100% 的信心。在该方法的文档中,Apple 指出

一个应用程序只有一个 Darwin 通知中心,因此该函数每次调用时都会返回相同的值。

因此,尽管这显然是合法的,但听起来也很像是违反了应用程序扩展限制固有的理念,即它们无法从托管应用程序访问任何内容。这就是 [UIApplication sharedApplication] 在扩展中被禁止的原因。我不禁想知道允许 CFNotificationCenterGetDarwinNotifyCenter 是否是一个疏忽,可能会在某个时候得到“修复”。

所以我想现在一个好的解决方案可能是使用MMWormhole因为他们实现了上述解决方案。

您的另一个选择是每次您的应用程序激活时检查用户默认值,并确认是否有任何密钥已更改,发布相关通知等。

祝你好运


归档时间:

查看次数:

1419 次

最近记录:

6 年,4 月 前