当前位置:首页 > 科技  > 软件

Swift 中 User Defaults 的读取和写入

来源: 责编: 时间:2023-11-03 17:07:46 495观看
导读前言User Defaults 是 Swift 应用程序存储在应用启动之间保持的首选项的首选解决方案。它是由属性列表(plist)文件支持的键-值存储。由于这种类型的支持存储,你需要了解支持的存储类型。在使用 User Defaults 时有一些最

WiE28资讯网——每日最新资讯28at.com

前言

User Defaults 是 Swift 应用程序存储在应用启动之间保持的首选项的首选解决方案。它是由属性列表(plist)文件支持的键-值存储。由于这种类型的支持存储,你需要了解支持的存储类型。WiE28资讯网——每日最新资讯28at.com

在使用 User Defaults 时有一些最佳实践。我还可以根据在数十个应用程序中使用它的实施经验,推荐特定的解决方案。让我们深入研究一下!WiE28资讯网——每日最新资讯28at.com

介绍 User Defaults

应用程序通常使用 User Defaults 来存储用户的首选项。你可以存储首选项,例如用户最喜欢的股票或保存特定用户状态,例如“用户已看到引导”。WiE28资讯网——每日最新资讯28at.com

存储这些首选项的代码可以如下所示:WiE28资讯网——每日最新资讯28at.com

UserDefaults.standard.set(true, forKey: "has-seen-onboarding")UserDefaults.standard.set(["AAPL", "TSLA"], forKey: "favorite-stocks")print(UserDefaults.standard.bool(forKey: "has-seen-onboarding")) // 打印:trueprint(UserDefaults.standard.array(forKey: "favorite-stocks")) // 打印:["AAPL", "TSLA"]

在这种情况下,我们使用了标准 User Defaults 容器。在大多数情况下,这将足够。但是,你可能希望考虑使用组 User Defaults 。WiE28资讯网——每日最新资讯28at.com

共享 User Defaults

与其他应用程序和扩展共享 User Defaults

使用所谓的应用组,你可以与其他应用程序和扩展共享 User Defaults 容器。我强烈建议从一开始就使用这种技术,即使现在可能没有共享首选项的需要,但如果你添加需要从主应用程序中读取或写入首选项的扩展,以后你会感谢自己的。WiE28资讯网——每日最新资讯28at.com

要配置应用组,你需要向项目设置中添加一个新的功能:WiE28资讯网——每日最新资讯28at.com

WiE28资讯网——每日最新资讯28at.com

你可以通过添加应用组功能来开始与其他应用程序和扩展共享 User Defaults。WiE28资讯网——每日最新资讯28at.com

你可以在苹果的文档中找到详细的说明。配置后,你可以使用组标识符创建新实例:WiE28资讯网——每日最新资讯28at.com

extension UserDefaults {    static let group = UserDefaults(suiteName: "group.your.identifier")}

现在,你可以通过使用静态属性来访问共享的组容器:WiE28资讯网——每日最新资讯28at.com

UserDefaults.group.set(["AAPL", "TSLA"], forKey: "favorite-stocks")

任何使用相同应用组的应用程序或扩展现在都可以读取和写入最喜欢的股票。我在 Stock Analyzer 中使用此技术,根据主应用程序中配置的最喜欢的股票填充小部件。WiE28资讯网——每日最新资讯28at.com

User Defaults 存储数据类型

属性列表必须支持你存储在 User Defaults 中的对象。只要你尝试写入不受支持的对象,你将立即遇到以下错误:WiE28资讯网——每日最新资讯28at.com

*** Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘Attempt to insert non-property list object UserDefaults.Stock(symbol: “AAPL”) for key last-opened-stock’

在这种情况下,我试图存储一个可编码的对象:WiE28资讯网——每日最新资讯28at.com

struct Stock: Decodable {    let symbol: String}UserDefaults.group.set(Stock(symbol: "AAPL"), forKey: "last-opened-stock")

每当你遇到此类异常时,你必须在存储数据之前将数据转换。你可以使用 JSONEncoder 将实例编码为数据,并在读取值时解码它。WiE28资讯网——每日最新资讯28at.com

User Defaults 支持以下类型:WiE28资讯网——每日最新资讯28at.com

  • 数据
  • 字符串
  • 数字(NSNumber)
  • 日期
  • 数组
  • 字典
  • 布尔值

如果你的类型不在此列表中,你需要找到一种将其转换为任何受支持类型的方法。WiE28资讯网——每日最新资讯28at.com

响应更改

尽管你可以使用 didChangeNotification 来观察更改,但我建议查看类似于 User Defaults Property Wrapper 的托管解决方案,用于实时监视更改。WiE28资讯网——每日最新资讯28at.com

监控 User Defaults 更改

在处理与 User Defaults 互动的功能时,你希望有一种实时监视更改的方法。为解决这个问题,我在 RocketSim 中构建了一个 User Defaults 编辑器,允许你实时编辑和监视键-值对。WiE28资讯网——每日最新资讯28at.com

例如,我在以下视频中正在开发 WeTransfer 应用程序中显示的工具提示。工具提示应该每位用户只显示一次,我希望确保 User Defaults 键 hasShownUploadFilesTooltip 相应地更新。你可以通过单击执行按钮并选择 User Defaults  plist 文件来打开编辑器。WiE28资讯网——每日最新资讯28at.com

RocketSim 的 User Defaults 编辑器允许你实时编辑和查看 User Defaults 值。WiE28资讯网——每日最新资讯28at.com

编辑器不断监视值,当值更改时会闪烁蓝色背景颜色。与此同时,我可以使用开关重置该值,并使用 RocketSim 重新启动应用程序,以查看工具提示是否再次显示。WiE28资讯网——每日最新资讯28at.com

你可以想象这大大加快了测试依赖于 User Defaults 的实施的工作流程。最好的是你可以免费开始并使用标准套件测试编辑器,只需从 Mac App Store 安装 RocketSim 即可。WiE28资讯网——每日最新资讯28at.com

覆盖User Defaults 设置

出于调试目的覆盖User Defaults 设置WiE28资讯网——每日最新资讯28at.com

虽然使用 RocketSim 有助于实现最佳更改和调试,但你可能希望在调试过程中使用方案设置来覆盖User Defaults 设置。WiE28资讯网——每日最新资讯28at.com

考虑的替代方案

在大多数情况下,User Defaults 是一个很好的解决方案,但如果你存储敏感数据或希望跨设备访问数据,你可能希望探索其他解决方案。WiE28资讯网——每日最新资讯28at.com

Keychain 用于安全性

User Defaults 不足以存储敏感数据。用户凭据、API 密钥或其他敏感数据应存储在钥匙串中。WiE28资讯网——每日最新资讯28at.com

用于跨平台的 CloudKit

如果希望首选项可以从安装了你的应用程序的其他 Apple 设备访问,请考虑使用 NSUbiquitousKeyValueStore。它是一个类似的键-值存储,但使用 iCloud 作为支持存储。WiE28资讯网——每日最新资讯28at.com

结论

你可以使用 User Defaults 存储首选项并在应用启动之间捕获状态。应用组非常适合与其他应用程序和扩展共享首选项,你需要密切关注可以存储的数据类型。通过监视支持存储,你将确保没有意外存储的数据。当需要跨设备访问数据或需要存储敏感数据时,最好查看替代解决方案。WiE28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-16866-0.htmlSwift 中 User Defaults 的读取和写入

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 使用 SwiftUI 创建一个灵活的选择器

下一篇: 深入浅出RabbitMQ:顺序消费、死信队列和延时队列

标签:
  • 热门焦点
  • 容量越大越不坏?24万块硬盘故障率报告公布 这些产品零故障

    容量越大越不坏?24万块硬盘故障率报告公布 这些产品零故障

    8月5日消息,云存储服务商Backblaze发布了最新的硬盘故障率报告,年故障率有所上升。Backblaze发布的硬盘季度统计数据,其中包括故障率等重要方面。这些结
  • 三言两语说透设计模式的艺术-简单工厂模式

    三言两语说透设计模式的艺术-简单工厂模式

    一、写在前面工厂模式是最常见的一种创建型设计模式,通常说的工厂模式指的是工厂方法模式,是使用频率最高的工厂模式。简单工厂模式又称为静态工厂方法模式,不属于GoF 23种设计
  • 掘力计划第 20 期:Flutter 混合开发的混乱之治

    掘力计划第 20 期:Flutter 混合开发的混乱之治

    在掘力计划系列活动第20场,《Flutter 开发实战详解》作者,掘金优秀作者,Github GSY 系列目负责人恋猫的小郭分享了Flutter 混合开发的混乱之治。Flutter 基于自研的 Skia 引擎
  • K8S | Service服务发现

    K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌在KDD 2023发表了一篇工作,探索了推荐系统ranking模型的训练稳定性问题,分析了造成训练稳定性存在问题的潜在原因,以及现有的一些提升模型稳定性方法的不足,并提出了一种新
  • 梁柱接棒两年,腾讯音乐闯出新路子

    梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 当家的盒马,加速谋生

    当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己“当家”的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 2299元起!iQOO Pad开启预售:性能最强天玑平板

    2299元起!iQOO Pad开启预售:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其搭载了天玑
  • 由于成本持续增加,笔记本产品价格预计将明显上涨

    由于成本持续增加,笔记本产品价格预计将明显上涨

    根据知情人士透露,由于材料、物流等成本持续增加,笔记本产品价格预计将在2021年下半年有明显上涨。进入6月下旬以来,全球半导体芯片缺货情况加剧,显卡、处理器
Top