Swift 中 User Defaults 的读取和写入

在这里插入图片描述

文章目录

    • 前言
    • 介绍 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.mzph.cn/news/205313.shtml

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

相关文章

Nginx实战教程二

一.介绍 本文介绍SPRINGBOOTVUE项目配置API服务器的两种情况 NGINX 配置VUE项目 二.vue项目和后端api接口不在同一台服务器 如果打包好的vue项目应用(dist) 和后端 api 接口没有运行在同一个主机上 此时需要在开发环境下将 API 请求代理到 API 所在服务器。通过配置 vue.confi…

基于ssm实验室课程管理系统源码和论文

idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 环境: jdk8 tomcat8.5 摘 要 随着科学实验规模的不断扩大,实验室课程数量的急剧增加,有关实验室课程的各种信息量也在不断成倍增长。面对庞大的信息量,就需要有…

HBase 使用JDK21

HBase 使用JDK21 启动zookeeper和hadoop 创建软件目录 mkdir -p /opt/soft cd /opt/soft下载软件 wget https://dlcdn.apache.org/hbase/2.5.6/hbase-2.5.6-hadoop3-bin.tar.gz解压 hbase tar -zxvf hbase-2.5.6-hadoop3-bin.tar.gz修改 hbase 目录名称 mv hbase-2.5.6-had…

一则广告,一个故事,这就我选择学习计算机专业的两个原因

还记得当初自己为什么选择计算机? 现在回想起来,当初驱使自己选择学习计算机专业的原因,一共有两个: 一、一则长城电脑的广告。 上个世纪80年代,我还在读小学,当时在中央电视台上经常播放着的长城电脑的一则…

Abaqus基础教程--胶合失效仿真

胶合是电子行业中常见的连接方式,abaqus中常用cohesive单元或者cohesive接触两种方法进行胶合失效仿真,这两种方式操作方法有所差别,但结果一般大同小异。 本例模型比较简单,建模过程从略,使用静态分析,使…

【GAMES101】三维变换

games101的第四节课讲了三维变换和观察变换,我们这里先记录一下三维变换的知识,后面再讲观察变换 齐次坐标下的三维变换 类似于解决之前二维变换平移的问题,三维变换下用齐次坐标通过增加一个维度来表示,第四个维度为1表示这是个…

无敌是多么的寂寞!一本书讲透Java多线程!吊打多线程从原理到实践!

摘要 互联网的每一个角落,无论是大型电商平台的秒杀活动,社交平台的实时消息推送,还是在线视频平台的流量洪峰,背后都离不开多线程技术的支持。在数字化转型的过程中,高并发、高性能是衡量系统性能的核心指标&#xff…

vue2+electron桌面端一体机应用

vue2+electron项目 前言:公司有一个项目需要用Vue转成exe,首先我使用vue-cli脚手架搭建vue2项目,然后安装electron 安装electron 这一步骤可以省略,安装electron-builder时会自动安装electron npm i electron 安装electron-builder vue add electron-builder 项目中多出…

(NeRF学习)3D Gaussian Splatting Instant-NGP

学习参考: 3D Gaussian Splatting入门指南【五分钟学会渲染自己的NeRF模型,有手就行!】 三维重建instant-ngp环境部署与colmap、ffmpeg的脚本参数使用 一、3D Gaussian Splatting (一)3D Gaussian Splatting环境配置…

JVM 类的加载器的基本特征和作用

Java全能学习面试指南:https://javaxiaobear.cn 1、作用 类加载器是 JVM 执行类加载机制的前提 ClassLoader的作用: ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信…

【跨境营商】创新科技助力数码转型 增强大湾区企业核心竞争力

粤港澳大湾区作为国家的重点发展区域,坐拥丰富的资源及商机,企业积极推行数码化,务求在大湾区抢占先机。香港电讯商业客户业务董事总经理吴家隆表示,近年企业锐意加快数码化步伐,香港电讯以创新科技融入的数码方案&…

UE学习C++(1)创建actor

创建新C类 在 虚幻编辑器 中,点击 文件(File) 下拉菜单,然后选择 新建C类...(New C Class...) 命令: 此时将显示 选择父类(Choose Parent Class) 菜单。可以选择要扩展的…

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

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

电商类直播介绍

电商直播是一种购物方式,通过直播技术向消费者展示商品,并引导其进行购买。在法律上,电商直播属于商业广告活动,主播需要根据具体行为承担“广告代言人"“广告发布者"或“广告主"的责任。 电商直播的特点在于其更…

月薪6W!美团、网易等大厂急招HarmonyOS开发!

近期,多家互联网公司发布了多个和鸿蒙系统有关的岗位。 不仅如此,还与Windows等主流老牌操作系统并列,并且排在首位介绍。 此外,今日头条招聘Android开发工程师也提及岗位需要“负责今日头条 Android、鸿蒙系统等新技术方向调研…

Http协议与Tomcat

HTTP协议 HTTP协议(HyperText Transfer Protocol)即超文本传输协议 ,是TCP/IC网络体系结构应用层的一个客户端-服务端协议,是所有客户端,服务端数据传输的基石(数据传输规则) 特点 ⭐基于TCP协…

class059 建图、链式前向星、拓扑排序【算法】

class059 建图、链式前向星、拓扑排序【算法】 code1 建图 package class059;import java.util.ArrayList; import java.util.Arrays;public class Code01_CreateGraph {// 点的最大数量public static int MAXN 11;// 边的最大数量// 只有链式前向星方式建图需要这个数量// 注…

基于AT89C51单片机的秒表设计

1.设计任务 利用单片机AT89C51设计秒表,设计计时长度为9:59:59,超过该长度,报警。创新:设置重启;暂停;清零等按钮。最后10s时播放音乐提示。 本设计是采用AT89C51单片机为中心,利用其…

zabbix的自动发现和注册、proxy代理和SNMP监控

目录 一、zabbix自动发现与自动注册机制: 1、概念 2、zabbix 自动发现与自动注册的部署 二、zabbix的proxy代理功能: 1、工作流程 2、安装部署 三、zabbix-snmp 监控 1、概念 2、安装部署 四、总结: 一、zabbix自动发现与自动注册…

细讲结构体

结构体是一些值的集合,这些值就是成员变量,这些变量可以是不同类型的。 当我们存放一个学生的信息是,包括性别,姓名,学号,年龄等内容,这些值是不同类型的,这是我们就可以使用结构体来…