随机生成标签的展示数据采集及UserDefaults存储可行性咨询
问题解答
关于UserDefaults是否可用
可以使用,但不是最优方案。UserDefaults的设计定位是存储少量轻量配置类数据(比如用户偏好设置),针对你当前的临时考题关联数据场景,它存在以下局限性:
- 额外的全量磁盘IO开销:UserDefaults底层是plist文件存储,每次读写都要操作磁盘,对于仅当前会话使用的临时数据完全没必要产生多余性能消耗
- 不适合存储结构化关联数据:如果后续需要为每个标签扩展关联属性(比如对应考题ID、正误标记),UserDefaults的键值存储逻辑会变得非常难以维护
更优实现方案
首先优化你现有重复冗余的赋值代码,同时直接采集生成的随机标签内容,不需要额外再读取15次label的text属性:
// 先把所有标签放到数组中,避免重复写15次赋值逻辑 let allLabels = [label1, label2, label3, label4, label5, label6, label7, label8, label9, label10, label11, label12, label13, label14, label15] // 定义属性存储当前生成的随机城市列表,直接完成内容采集 var currentQuizCities: [String] = [] // 遍历完成标签赋值+内容采集 for label in allLabels { guard let randomCity = quizBrain.cities.randomElement() else { continue } label.text = randomCity currentQuizCities.append(randomCity) }
之后根据你的业务使用场景选择存储方案即可:
- 如果仅在当前App运行会话内需要使用这些标签内容:直接持有上面的
currentQuizCities数组即可,内存读写性能最高,没有额外开销 - 如果需要App重启后仍保留历史标签内容:
- 若仅需要存储这15个字符串:可以使用UserDefaults,存读参考代码如下:
存储:UserDefaults.standard.set(currentQuizCities, forKey: "current_quiz_cities")
读取:let savedCities = UserDefaults.standard.stringArray(forKey: "current_quiz_cities") ?? [] - 若后续需要扩展存储更多考题关联的结构化数据:推荐使用
NSKeyedArchiver归档自定义模型,或者用Core Data存储,数据结构更清晰,可扩展性更强
- 若仅需要存储这15个字符串:可以使用UserDefaults,存读参考代码如下:
内容的提问来源于stack exchange,提问作者COGNATE LABS
相关产品推荐
相关产品推荐

