iOS 的数据持久化是指将应用运行过程中产生的数据保存到设备的本地存储中,以便下次启动或在需要时读取。根据数据的结构复杂度、读写频率、安全性要求等不同场景,iOS 提供了多种持久化方案:
常见的数据持久化方式 1. NSUserDefaults
/ UserDefaults
适用场景 :轻量级数据,如设置项、登录状态、首选项。
存储类型 :基本类型(String
、Bool
、Int
、Float
、Double
)、数组、字典、Data
。
存储位置 :Library/Preferences
目录下的 plist 文件。
优点 :简单易用,自动持久化。
缺点 :不适合存储大量或结构复杂的数据。
1 2 UserDefaults .standard.set(true , forKey: "hasLaunchedBefore" )let launched = UserDefaults .standard.bool(forKey: "hasLaunchedBefore" )
2. Keychain
适用场景 :存储敏感信息,如密码、token。
安全性高 :系统级别的加密存储,支持 Touch ID / Face ID。
缺点 :API 较复杂,可通过第三方库简化如 KeychainAccess
、SAMKeychain
。
1 2 3 let keychain = Keychain (service: "com.example.app" )try? keychain.set("secret-token" , key: "authToken" )let token = try? keychain.get("authToken" )
3. File System
适用场景 :音视频、图片、文本文件、自定义数据模型的二进制形式。
常用 API :FileManager
文件位置 :
Documents
:用户生成内容,iCloud 会备份
Caches
:缓存数据,系统可能清理
tmp
:临时数据,随时会被删除
1 2 let fileURL = FileManager .default.urls(for: .documentDirectory, in: .userDomainMask)[0 ].appendingPathComponent("myData.txt" )try? "Hello" .write(to: fileURL, atomically: true , encoding: .utf8)
4. Core Data
适用场景 :结构化复杂数据的本地数据库存储。
优点 :
Apple 官方支持的对象图管理框架
支持数据模型、关系型建模、查询优化、懒加载等
可结合 iCloud 使用
缺点 :学习曲线较陡,不适合简单数据
1 2 3 let entity = NSEntityDescription .insertNewObject(forEntityName: "Person" , into: context)entity.setValue("Tom" , forKey: "name" ) try? context.save()
5. SQLite
适用场景 :对数据库结构完全控制;数据量大、结构清晰。
优点 :灵活、高性能、广泛应用
缺点 :原生 C 接口复杂,推荐使用封装库,如:
FMDB
(Objective-C 封装)
GRDB.swift
(Swift 封装)
6. Realm
适用场景 :替代 Core Data 或 SQLite,简单易用、性能优。
优点 :
不需要 schema migration 写 SQL
跨平台
响应式数据监听支持
缺点 :是第三方库,需集成维护
1 2 3 4 5 6 7 8 9 class Dog : Object { @Persisted var name = "" @Persisted var age = 0 } let dog = Dog ()dog.name = "Rex" try! realm.write { realm.add(dog) }
7. Codable + File System
适用场景 :中等复杂的数据模型,自定义结构序列化为 JSON
/Plist
/Binary
。
优点 :轻量、灵活。
配合方式 :
JSONEncoder/Decoder
PropertyListEncoder/Decoder
1 2 3 4 5 6 7 struct User : Codable { let name: String let age: Int } let user = User (name: "Alice" , age: 25 )let data = try JSONEncoder ().encode(user)try data.write(to: fileURL)
总结对比
方案
优点
缺点
适用场景
UserDefaults
简单易用
不适合复杂/大量数据
配置、轻量状态
Keychain
高安全性
API复杂
密码、token
File System
灵活、支持任意数据
手动管理读写/序列化
文件、缓存、二进制资源
Core Data
强大对象关系管理
学习成本高
中大型结构化数据
SQLite
精细控制、高性能
C语言繁琐
数据库开发、性能敏感场景
Realm
简洁高效
第三方库依赖
快速开发结构化数据存储
Codable + File
灵活易于维护
无查询机制
自定义模型、轻量数据库替代品