当前位置:   article > 正文

iOS 15 之 SwiftData_storage swiftdata

storage swiftdata

SwiftData - iOS缓存策略(Draft)

SwiftData 是什么?

故名思义,是用swift写的用来实现存储的一个原生库,(当然,大多数用swift写,也有用C写的)
  • 1

怎么用?

先上代码,后解释
1. 对于model,首先添加swiftData引用,然后使用@Model就OK啦,这样完成model的持久化设置啦

import Foundation
import SwiftData

@Model
final class Card {
    var front: String
    var back: String
    var creationDate: Date

    init(front: String, back: String, creationDate: Date = .now) {
        self.front = front
        self.back = back
        self.creationDate = creationDate
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

2. 对于app,只需要添加.modelContainer,告诉app,要缓存谁的堆栈,就OK啦

import SwiftUI

@main
struct swiftDataDemoApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .modelContainer(for: Card.self)
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3. 对于需要使用model的View,如下操作

import SwiftUI
import SwiftData

struct ContentView: View {
	@Query private var cards: [Card] // 1. 使用Query来修饰model
    @Environment(\.modelContext) private var modelContext // 2. 用modelContext来增删改查
    var body: some View {
         VStack {
            ForEach(cards) { card in
                Text(card.front)
            }
            Button {
                let newCard = Card(front: "Sample Front", back: "Sample Back")
                // save card
                modelContext.insert(newCard)
            } label: {
               Text("Add Data")
            }
        }
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

------开始解释------

核心功能点1. @Model

  1. 是一种全新的宏,可以帮助你在Swift代码中定义模型框架。
  2. SwiftData一般用Swift,在特殊需要下,你可以使用额外的元数据对属性进行标注。
  3. 使用这一架构,SwiftData将为你的模型对象增添强大的功能。

使用的时候,只需两步,就完成持久化操作了。

  1. import swiftData
  2. @model在 class A {}之前

swiftData将值类属性转换为表类属性
支持基础类属性,int,float,string
也包含更多复杂的值类型:enum,struct,codable,Collections of value types

将引用类型表述为关系
Model之间,和模型的集合

@Model 将修改你model上的全部属性,你可以使用属性上的元数据来影响swiftData,@Model 可以修改你的model的存储属性来帮助ModelContext自动追踪你的更改,并将他们纳入下一次保存操作中

@Attribute来添加唯一约束
@Relationship来控制反演选项,并详细说明删除传播规则
这改变了模型间链接的行为
@Transient 指定删除属性

更多请查看Model your schema with swiftData

核心功能点2. Model Container

  1. Model Container 为你的建模类别提供持久化后端
  2. 你可以仅指定架构规范来使用默认设置
  3. 提供schema迁移选项

你可以仅通过指定想要存储的建模类型列表来创建Model Container

核心功能点3. ModelContext

MContext 用来获取和保存数据
modelContext监控着模型中的所有变动,并提供一系列操作动作,tracking,fetching,saving,undoing

在试图层次结构外,你可以要求模型容器提供一个与Main Actor绑定的上下文,即 contain.mainContext
或者 你可以准对给定模型容器实例化新上下文,ModelContext(container)

补充. Fetch 基于 Predicate和FetchDescriptor

Predicate 是iOS17中的新功能, 它采用swift原生类型并使用swift宏进行强类型构建,它经由完全类型检查,可以视作现代NSPredicate的替代品

Swift 原生类型是啥??和keypath

FETCHDESCRIPTOR 提供多种途径来进行定制化SwiftData查询,除了判断条件和排序,你可以指定相关对象进行预抓取,限制结束计数以及从结果中排出未保存的更改等操作

swiftData通过ModelContext驱动这些操作,Insert,delete,save,change

请查看Dive deeper into SwiftData

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/814982
推荐阅读
相关标签
  

闽ICP备14008679号