CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
iOS 开发入门/课时/数据持久化
RawBlame
课时目录12 节

iOS 开发入门

  1. 01iOS 生态与 Xcode
  2. 02Swift 语言基础
  3. 03UIKit 与 Interface Builder
  4. 04SwiftUI 入门
  5. 05架构模式
  6. 06数据持久化
  7. 07网络与 API
  8. 08并发与响应式
  9. 09依赖管理与 CI
  10. 10测试与调试
  11. 11上架与 ASO
  12. 12综合练习

数据持久化

Core Data、UserDefaults、Keychain。

35 分钟

数据持久化

iOS 本地存储分层:UserDefaults 存偏好、Keychain 存敏感凭证、Core Data / SwiftData 存结构化数据。对照 /roadmaps/ios「Data Persistence」节点。

学习目标

  • 选择合适的存储方案(轻量 vs 关系型)
  • 使用 UserDefaults 与 Keychain 读写配置与 Token
  • 了解 Core Data 实体建模与 CRUD 基础
  • 对照 Spring JPA 与浏览器 localStorage

核心概念

UserDefaults — 轻量键值

// 写入
UserDefaults.standard.set(true, forKey: "hasSeenOnboarding")
UserDefaults.standard.set("dark", forKey: "theme")

// 读取
let seen = UserDefaults.standard.bool(forKey: "hasSeenOnboarding")
let theme = UserDefaults.standard.string(forKey: "theme") ?? "light"

适合主题、引导页标记等小数据。不要存 Token 或密码。

Keychain — 安全存储

import Security

enum KeychainHelper {
    static func save(_ data: Data, service: String, account: String) throws {
        let query: [CFString: Any] = [
            kSecClass: kSecClassGenericPassword,
            kSecAttrService: service,
            kSecAttrAccount: account,
            kSecValueData: data,
        ]
        SecItemDelete(query as CFDictionary)
        let status = SecItemAdd(query as CFDictionary, nil)
        guard status == errSecSuccess else { throw KeychainError.unhandled(status) }
    }

    static func load(service: String, account: String) throws -> Data? {
        let query: [CFString: Any] = [
            kSecClass: kSecClassGenericPassword,
            kSecAttrService: service,
            kSecAttrAccount: account,
            kSecReturnData: true,
        ]
        var result: AnyObject?
        let status = SecItemCopyMatching(query as CFDictionary, &result)
        guard status == errSecSuccess else { return nil }
        return result as? Data
    }
}

enum KeychainError: Error {
    case unhandled(OSStatus)
}

Keychain 加密存储,适合 JWT、API Key;系统级安全,卸载 App 行为可配置。

Core Data 基础

Core Data 是 Apple 的 ORM 框架:Entity → NSManagedObject,支持关系、迁移、iCloud 同步。

// 简化的 CRUD 思路(需 Xcode Data Model 定义 LessonEntity)
func saveLesson(_ lesson: Lesson, context: NSManagedObjectContext) throws {
    let entity = LessonEntity(context: context)
    entity.id = Int64(lesson.id)
    entity.title = lesson.title
    entity.completed = lesson.completed
    try context.save()
}

func fetchLessons(context: NSManagedObjectContext) throws -> [Lesson] {
    let request = LessonEntity.fetchRequest()
    request.sortDescriptors = [NSSortDescriptor(key: "id", ascending: true)]
    let results = try context.fetch(request)
    return results.map { Lesson(id: Int($0.id), title: $0.title ?? "", completed: $0.completed) }
}

iOS 17+ 可选 SwiftData(@Model 宏),API 更 Swift 原生。复杂查询仍常用 Core Data。

与 Java/Spring 或 React 对照

iOSJava / SpringWeb
UserDefaultsapplication.properties 本地localStorage
Keychain密钥库 / VaultHttpOnly Cookie
Core Data / SwiftDataJPA / HibernateIndexedDB
FileManager文件 IOFile API
iCloud Sync——

Spring 服务端持久化见 sql-essentials;客户端离线缓存 Web 侧常用 localStorage + Service Worker。

练习

  • 用 UserDefaults 记住用户上次打开的 Track slug
  • 将 mock JWT 写入 Keychain,启动时读取
  • 在 Core Data 中创建 Lesson 实体,实现增删查

小结

UserDefaults 轻量、Keychain 安全、Core Data 结构化。 下一课网络请求。见 ios-essentials。

加载本节练习…
← 上一课架构模式下一课 →网络与 API