Swift 中 User Defaults 的读取和写入

news2025/1/9 15:23:37

在这里插入图片描述

文章目录

    • 前言
    • 介绍 User Defaults
    • 共享 User Defaults
    • User Defaults 存储数据类型
    • 响应更改
    • 监控 User Defaults 更改
    • 覆盖User Defaults 设置
    • 考虑的替代方案
      • Keychain 用于安全性
      • 用于跨平台的 CloudKit
    • 结论

前言

User Defaults 是 Swift 应用程序存储在应用启动之间保持的首选项的首选解决方案。它是由属性列表(plist)文件支持的键-值存储。由于这种类型的支持存储,你需要了解支持的存储类型。

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

介绍 User Defaults

应用程序通常使用 User Defaults 来存储用户的首选项。你可以存储首选项,例如用户最喜欢的股票或保存特定用户状态,例如“用户已看到引导”。

存储这些首选项的代码可以如下所示:

UserDefaults.standard.set(true, forKey: "has-seen-onboarding")
UserDefaults.standard.set(["AAPL", "TSLA"], forKey: "favorite-stocks")

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

在这种情况下,我们使用了标准 User Defaults 容器。在大多数情况下,这将足够。但是,你可能希望考虑使用组 User Defaults 。

共享 User Defaults

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

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

要配置应用组,你需要向项目设置中添加一个新的功能:

你可以通过添加应用组功能来开始与其他应用程序和扩展共享 User Defaults。

你可以在苹果的文档中找到详细的说明。配置后,你可以使用组标识符创建新实例:

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

现在,你可以通过使用静态属性来访问共享的组容器:

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

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

User Defaults 存储数据类型

属性列表必须支持你存储在 User Defaults 中的对象。只要你尝试写入不受支持的对象,你将立即遇到以下错误:

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

在这种情况下,我试图存储一个可编码的对象:

struct Stock: Decodable {
    let symbol: String
}

UserDefaults.group.set(Stock(symbol: "AAPL"), forKey: "last-opened-stock")

每当你遇到此类异常时,你必须在存储数据之前将数据转换。你可以使用 JSONEncoder 将实例编码为数据,并在读取值时解码它。

User Defaults 支持以下类型:

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

如果你的类型不在此列表中,你需要找到一种将其转换为任何受支持类型的方法。

响应更改

尽管你可以使用 didChangeNotification 来观察更改,但我建议查看类似于 User Defaults Property Wrapper 的托管解决方案,用于实时监视更改。

监控 User Defaults 更改

在处理与 User Defaults 互动的功能时,你希望有一种实时监视更改的方法。为解决这个问题,我在 RocketSim 中构建了一个 User Defaults 编辑器,允许你实时编辑和监视键-值对。

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

RocketSim 的 User Defaults 编辑器允许你实时编辑和查看 User Defaults 值。

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

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

覆盖User Defaults 设置

出于调试目的覆盖User Defaults 设置

虽然使用 RocketSim 有助于实现最佳更改和调试,但你可能希望在调试过程中使用方案设置来覆盖User Defaults 设置。

考虑的替代方案

在大多数情况下,User Defaults 是一个很好的解决方案,但如果你存储敏感数据或希望跨设备访问数据,你可能希望探索其他解决方案。

Keychain 用于安全性

User Defaults 不足以存储敏感数据。用户凭据、API 密钥或其他敏感数据应存储在钥匙串中。

用于跨平台的 CloudKit

如果希望首选项可以从安装了你的应用程序的其他 Apple 设备访问,请考虑使用 NSUbiquitousKeyValueStore。它是一个类似的键-值存储,但使用 iCloud 作为支持存储。

结论

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1292565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 PyQt 中实现异步数据库请求

需求 开发软件的时候不可避免要和数据库发生交互,但是有些 SQL 请求非常耗时,如果在主线程中发送请求,可能会造成界面卡顿。这篇博客将会介绍一种让数据库请求变得和前端的 ajax 请求一样简单,且不会阻塞界面的异步请求方法。 实…

kepler.gl部署在线说明文档

1 概述 1.1 介绍 1、Kepler.gl 是一个强大的开源地理空间分析工具,用于大规模数据集的可视化。它由 Uber 的数据可视化团队开发,并且是基于 Web 技术构建的。Kepler.gl 涉及到以下几个主要技术领域: WebGL: Kepler.gl 通过 WebGL 进行渲染…

jetbrains 新编辑器 Fleet 修改主题颜色

当前Fleet主题只有五种 分别是 1、Dark Purple 2、Fleet Dark 3、Fleet Light 4、Gray 5、Sync with OS 其实这几种都不太好看 对眼睛不友好 可以选择一个白色主题进行自定义编辑 由于参数太多我直接全局替换把白色White换成了Yellow 70 为啥是Yellow 70? 把…

推荐一个可以记录历史进价的进销存软件?

“我是卖数码产品的,数码产品价格变动是比较大的,每次采购时候我都会多家对比价格,再决定在哪个厂家进货。所以基本上我每次进价价格都不一样,但是之前的询价情况又很难一一单独记录,让我采购的时候很被动。” “准备…

C++初学教程三

目录 一、运算符 一、自增自减运算符 二、位运算符 三、关系运算符 注意事项 四、条件运算符 注意事项 五、逻辑运算符 注意事项: 六、逗号运算符 概述 注意事项: 七、小结 运算符优先级和结合性一览表 一、运算符 一、自增自减运算符 运…

「Verilog学习笔记」根据状态转移写状态机-二段式

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 和三段式相比,就是将输出块和次态切换块合并。 timescale 1ns/1nsmodule fsm2(input wire clk ,input wire rst ,input wire data ,output reg flag );//****…

Linux Component概述和高通V4l2驱动模型

1 Linux为什么要引入Component框架? 为了让subsystem按照一定顺序初始化设备才提出来的。 subsystem中由很多设备模块,内核加载这些模块的时间不确定。子系统内有些模块是需要依赖其它模块先初始化才能进行自己初始化工作(例如v4l2 subdev和v4l2 video …

校园后勤数字化转型要怎么做?的修工单管理系统的功能强大吗?

2023年11月27日-29日,由中国教育后勤协会主办,广东省高校后勤协会、物业管理专业委员会、能源管理专业委员会、安全管理专业委员会、中小学后勤分会等协办的第六届中国教育后勤展览会在深圳圆满落幕。 广东工程宝科技有限公司以其创新的“的修工单管理系…

家用保险柜什么牌子好?

家用保险柜的品牌有很多,其中比较知名的有虎牌、得力、永发、思锐、迪堡、艾谱、全能、杰宝-大王、金虎、花都、飞云、威盾斯等等。这些品牌都有各自的特点和优势,例如虎牌品牌是来自于河北,每年生产60多台,质量可靠;得…

国内零代码链接器有哪些?

什么是零代码链接器? 零代码链接器,也是属于零代码集成领域,代表一种可以通过不编写代码就能让不同系统产生数据互通的技术,主要通过授权API接口暴露数据,让不同系统间的数据可以在内部互相调用,实现自动化…

【C++11并发】Atomic 笔记

简介 用atomic定义的变量,支持原子操作,即要么全部完成操作,要不全部没有完成,我们是不可能看到中间状态。一般在多线程程序中,可以用atomic来完成数据同步。 标准库为我们主要提供了四类工具 atomic类模板操作atomi…

ZStack Cloud云平台服务中国化学工程集团高性能数据库

中国化学工程通过ZStack Cloud云平台构建云基础设施,并为其提供高性能、高可用的云主机、云存储和云网络服务;并通过ZStack Cloud云平台弹性裸金属能力ZStack RDS数据库云平台,满足高性能数据库和多种数据库统一管理的需求;此外&a…

DOS 批处理 (二)

DOS 批处理 1. 基础 DOS 命令1.1 基础命令1.2 文件系统操作1.3 文件夹管理1.4 文件管理1.5 网络相关1.6 系统管理1.7 IF、FOR和NETIFFORNET 1. 基础 DOS 命令 command /? 查找帮助DOS命令不区分命令字母的大小写 C:\Users\Administrator>echo 1 1 C:\Users\Administrator…

我们一起聊一聊JWT的那些事

我们一起聊一聊JWT的那些事 一切美好,如期而至… 什么是JWT JWT,全称为 JSON Web Token,是一种用于在网络上安全地传递信息的开放标准(RFC 7519)。JWT 是一种紧凑且独立的方式,用于在各方之间以 JSON 对象…

Docker部署开源分布式任务调度系统DolphinScheduler与远程访问办公

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问,结合内…

STM32 定时器配置步骤

定时中断基本框架结构图: 根据结构图可按步骤配置定时器 第1步:RCC开启时钟。打开时钟后定时器的基准时钟和整个外设的工作时钟就会同时打开。 第2步:选择时基单元的时钟源。对于定时中断可选择内部时钟源. 第3步:配置时基单元…

12.7作业

1.头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QIcon> #include <QLabel> #include <QMovie> #include <QLineEdit> #include <QPushButton> class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidge…

论文笔记——DAS

论文&#xff1a;https://arxiv.org/pdf/2311.12091.pdf 代码&#xff1a;暂无 卷积神经网络&#xff08;CNNs&#xff09;在局部空间模式识别方面表现出色。对于许多视觉任务&#xff0c;如物体识别和分割&#xff0c;显著信息也存在于CNN核边界之外。然而&#xff0c;由于CN…

在Spring Cloud使用Hystrix核心组件,并注册到Eureka注册中心去

其实吧&#xff0c;写Spring Cloud系列&#xff0c;我有时候觉得也挺难受的&#xff0c;因为Spring Cloud的微服务启动都需要一个一个来&#xff0c;并且在IDea中也需要占用比较大的内存&#xff0c;并且我本来可以一篇写完5大核心组件的&#xff0c;但是我却分了三篇&#xff…

Implicit Neural Representation for Cooperative Low-light Image Enhancement

GitHub - Ysz2022/NeRCo: [ICCV 2023] Implicit Neural Representation for Cooperative Low-light Image Enhancement 参考&#xff1a;ICCV2023 | 将隐式神经表征用于“低光增强”&#xff0c;北大张健团队提出NeRCo (qq.com) 以下三个因素限制了现有低光图像增强方法的应用…