热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

KVO与Swift中的共享NSUserDefaults-KVOwithsharedNSUserDefaultsinSwift

IamhavingissuescommunicatingbetweenmyhostappanditsextensionsthroughcommunicatingNSUser

I am having issues communicating between my host app and its extensions through communicating NSUserDefaults changes.

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

I initialized NSUserDefaults using init(suiteName:), added KVO observer using the addObserver(...) method and overrided the method observeValueForKeyPath(...) but the method observeValueForKeyPath(...) is not called when I change the value corresponding to the observing key. It will be greatful if you help me to resolve this.

我使用init(suiteName :)初始化了NSUserDefaults,使用addObserver(...)方法添加了KVO观察者并覆盖了方法observeValueForKeyPath(...)但是当我更改了相应的值时没有调用observeValueForKeyPath(...)方法到观察的关键。如果你帮我解决这个问题会很棒。

PS:here suite name is App groups name and NSUserDefaults created using suiteName as group identifier will be inside the private area for app groups.

PS:此处套件名称是应用程序组名称,使用suiteName创建的NSUserDefaults作为组标识符将位于应用程序组的专用区域内。

1 个解决方案

#1


2  

The short answer is that you can't use KVO or even NSNotificationCenter on NSUserDefaults to communicate changes between an App Extension and the containing App.

简短的回答是,您无法在NSUserDefaults上使用KVO甚至NSNotificationCenter来在App扩展和包含应用程序之间进行通信。

There's a great post by Atomic Bird that looks at the ways of coordinating communication. In particular its interesting to look at his analysis of communicating user defaults changes:

Atomic Bird有一篇很棒的文章,着眼于协调沟通的方式。特别有趣的是,看看他对沟通用户默认值变化的分析:

A possible alternative for app/extension notifications is to use the Darwin notification center via CFNotificationCenterGetDarwinNotifyCenter, which actually is a little bit like NSDistributedNotificationCenter. There's some discussion of this by Wade Spires at Apple's dev forums site.

应用/扩展通知的另一种可能选择是通过CFNotificationCenterGetDarwinNotifyCenter使用Darwin通知中心,它实际上有点像NSDistributedNotificationCenter。在Apple的开发论坛网站上,Wade Spires对此进行了一些讨论。

I say "possible" because I'm not 100% confident of this continuing to work. In the documentation for this method, Apple notes that

我说“可能”,因为我对这种继续工作没有百分之百的信心。在这种方法的文档中,Apple注意到了这一点

An application has only one Darwin notification center, so this function returns the same value each time it is called.

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

So although this is apparently legal, it also sounds a lot like it violates the philosophy inherent in app extension restrictions, viz, that they can't access anything from the hosting app. This is why [UIApplication sharedApplication] is off limits in extensions. I can't help wonder if allowing CFNotificationCenterGetDarwinNotifyCenter is an oversight that might get "fixed" at some point.

因此,尽管这显然是合法的,但它听起来很像违反了应用扩展限制中固有的哲学,即他们无法从托管应用访问任何内容。这就是[UIApplication sharedApplication]在扩展中不受限制的原因。我不禁要问,是否允许CFNotificationCenterGetDarwinNotifyCenter是一种可能在某些时候“固定”的疏忽。

So I guess for now a good solution might be to use MMWormhole as they implement the above solution.

所以我想现在一个好的解决方案可能就是使用MMWormhole来实现上述解决方案。

Your other option is to use to check the user defaults every time your App becomes active and confirm whether any keys have changed, posting the relevant notifications etc.

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

Good luck


推荐阅读
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • andr ... [详细]
author-avatar
lenpre2017
林频仪器(http://www.linpin.com/)主营产品:盐雾试验箱、高低温试验箱、恒温恒湿试验箱,林频仪器是中国环境试验设备行业中唯一的股份制高新技术企业,是中国领先的环境试验设备制造商和可靠性环境试验解决方案综合服务商,拥有中国最大的环境试验设备生产基地,客户遍布全球40多个国家和地区。林频仪器现已发展成为环境试验设备领域的龙头企业。 ■ 凭借创新的产品、高效的供应链和强大的战略执行力,林频仪器锐意为全球用户打造优质、安全、环保的产品及专业高效的服务。 ■ 林频仪器产品系列包括:温
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有