Swift UI数据存储

一. @StateObject 数据存储机制

@StateObject 保存的数据存储在设备内存(RAM)中,是临时存储

swift 复制代码
import SwiftUI
internal import Combine
class BloodGlucoseStore: ObservableObject{
    @Published var count = 0 // 存储在内存中
    
}

struct JLHomeView: View {
    @StateObject private var store = BloodGlucoseStore()// 对象存在于内存中
    var body: some View {
        Text("记录数量:\(store.count)")
        Button("点击") {
            store.count += 1
        }
        
    }
}

数据生命周期

  • 创建时机:视图第一次被创建时
  • 保持时机:视图重新渲染时数据保持不变
  • 销毁时机:视图被销毁时数据丢失
swift 复制代码
struct ContentView: View {
    @State private var showHomeView = false
    
    var body: some View {
        VStack {
            Button("显示/隐藏 HomeView") {
                showHomeView.toggle()
            }
            
            if showHomeView {
                JLHomeView()  // 创建时:数据在内存中创建
            }              // 销毁时:数据从内存中清除
        }
    }
}

二. UserDefaults 存储机制

存储位置

  • 📁 应用沙盒中的 .plist 文件
  • 路径:/Library/Preferences/[Bundle-ID].plist

UserDefaults 数据安全性

✅ 不会丢失的情况
  • 应用更新:数据保持不变
  • 应用重启:数据依然存在
  • 设备重启:数据保持不变
  • iOS 系统更新:数据通常保持
❌ 会丢失的情况
  • 卸载应用:整个应用沙盒被删除
  • 恢复设备但不恢复备份:数据丢失
  • 手动清除应用数据:通过系统设置清除
Swift 复制代码
class SettingStore: ObservableObject{
    
    @Published var isDarmMode: Bool{
        didSet{
            /// 保存数据
            UserDefaults.standard.set(isDarmMode, forKey: "isDarmMode")
            UserDefaults.standard.synchronize()
        }
    }
    
    init(){
        /// 读数数据
        isDarmMode = UserDefaults.standard.bool(forKey: "isDarmMode")
    }
    deinit{
        /// 删除数据
        UserDefaults.standard.removeObject(forKey: "isDarmMode")
        UserDefaults.standard.synchronize()
    }
}

三. @Published 属性包装器

核心作用

@Published 的主要作用是自动触发 UI 更新

csharp 复制代码
class CounterStore: ObservableObject {
    var count = 0  // 普通属性
    
    func increment() {
        count += 1  // UI 不会更新!
    }
}

实际应用示例

less 复制代码
class BloodGlucoseStore: ObservableObject {
    @Published var records: [BloodGlucoseRecord] = []
    @Published var isLoading = false
    @Published var errorMessage: String?
    @Published var selectedDate = Date()
    @Published var filterType: FilterType = .all
    
    // 计算属性也会响应 @Published 属性的变化
    var filteredRecords: [BloodGlucoseRecord] {
        switch filterType {
        case .all:
            return records
        case .today:
            return records.filter { Calendar.current.isDateInToday($0.date) }
        case .thisWeek:
            return records.filter { $0.date.isInCurrentWeek }
        }
    }
    
    func addRecord(_ record: BloodGlucoseRecord) {
        records.append(record)  // 触发 UI 更新
    }
    
    func setFilter(_ filter: FilterType) {
        filterType = filter  // 触发筛选更新
    }
}

高级用法

自定义 setter
swift 复制代码
class UserStore: ObservableObject {
    @Published var username: String = "" {
        didSet {
            validateUsername()
            saveToUserDefaults()
        }
    }
    
    @Published var isUsernameValid = false
    
    private func validateUsername() {
        isUsernameValid = username.count >= 3
    }
}
级联更新
scss 复制代码
class ShoppingCartStore: ObservableObject {
    @Published var items: [CartItem] = [] {
        didSet {
            updateTotalPrice()  // items 变化时自动更新总价
        }
    }
    
    @Published var totalPrice: Double = 0
    @Published var discountCode: String = "" {
        didSet {
            updateTotalPrice()  // 折扣码变化时也更新总价
        }
    }
    
    private func updateTotalPrice() {
        let subtotal = items.reduce(0) { $0 + $1.price * Double($1.quantity) }
        let discount = calculateDiscount(for: discountCode)
        totalPrice = subtotal - discount
    }
}
相关推荐
懋学的前端攻城狮17 小时前
iOS 列表性能优化实战:从 45fps 到 60fps 的蜕变
ios·性能优化·ui kit
斯班奇的好朋友阿法法18 小时前
鸿蒙 vs iOS vs 微信小程序:开发平台全面对比
ios·微信小程序·harmonyos
@大迁世界1 天前
14个你现在必须关闭的 iOS 26 设置,不然手机很快被它榨干
macos·ios·智能手机·objective-c·cocoa
YJlio2 天前
10.2.8 以其他账户运行服务(Running services in alternate accounts):为什么“把服务切到某个用户账号下运行”,本质上是在改变服务的整个安全上下文?
python·安全·ios·机器人·django·iphone·7-zip
pop_xiaoli2 天前
【iOS】KVC与KVO
笔记·macos·ios·objective-c·cocoa
90后的晨仔2 天前
《swiftUI进阶 第10章:现代状态管理(iOS 17+)》
ios
sakiko_2 天前
UIKit学习笔记4-使用UITableView制作滚动视图
笔记·学习·ios·swift·uikit
小锋学长生活大爆炸2 天前
【开源软件】这次iPhone也是用上Claw了 | PhoneClaw
ios·开源软件·iphone·claw
SameX3 天前
独立开发一个把走过的路变成 km² 的 App,聊聊 25m 网格和后台 GPS 的坑
ios
XD7429716363 天前
科技早报晚报|2026年4月30日:Agent 安全壳、浏览器 iOS 测试台与可穿戴数据 API,今天更值得看的 3 个技术机会
科技·ios·开源项目·科技新闻·开发者工具