首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SwiftUI 与 Core Data —— 数据获取

尽管在实践中,如果能在确保不访问托管对象的非线程安全属性的前提下,在非创建托管对象的线程中持有托管对象并不会出现崩溃的情况,但出于谨慎的考虑,我最终还是放弃了这种方式。...FetchRequest 获取 )由于 TCA 的 Reducer 无法与视图的存续期自动绑定,上面的可感知延迟在每次触发 onAppear 时都将出现最终,我决定放下心结,仍然采用在视图中使用类似...通过新创建一个可以使用 Mock 数据的 FetchRequest ,实现了 SwiftUI 与 Core Data —— 问题[6] 一文中提出的可测试、可预览、可模块化的目标。...MockableFetchRequest 的使用方法MockableFetchRequest 提供与 FetchRequest 类似的动态获取数据的能力,但它有如下的特点:MockableFetchRequest...,避免引发视图的不必要的更新通过创建一个具有包装用途的引用类型来持有需要修改的数据( 在 @State 中持有引用 ),便可以达成如下目的:1、让数据的生命周期与视图生存期一致;2、数据可更改;3、更改数据不会引发视图更新

4.7K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Ask Apple 2022 中与 Core Data 有关的问答 (下)

    @FetchRequest 包装了一个 NSFetchedResultsController,它没有自己的特殊逻辑。获取数据的方式Q:我想知道哪种是比较好的方式?...还是只使用一个 fetchRequest,然后将数据保存在本地,并通过上述方法访问它( 应该是指第一种方式 )?我想知道这里的最佳做法是什么。谢谢!A:一般来说,不同的视图经常使用不同的获取请求。...例如,当你创建一个带有字符串属性的新对象时,初始值( 在没有默认值的情况下 )是 nil,这在对象被验证之前( 通常在 save 时 )是没有问题的。...即使你在模型编辑器中将属性( 例如字符串 )标记为非可选( 设定了默认值 ),但在从托管对象获取属性值的时候,返回值仍会是 Optional 类型。...我的数据模型中有一个 Int16 类型的 userOrder 属性,在表视图的行被重新排序后,有什么好的方法来保存数据的新顺序?

    3.3K20

    SwiftUI属性包装器如何处理结构体

    已经了解了 SwiftUI 如何通过使用 @State 属性包装器将变化的数据存储在结构体中,如何使用 $ 将状态绑定到UI控件的值,以及更改 @state 包装的属性时是如何自动让 SwiftUI 重新调用我们的结构体的...为了了解这里发生的事情,我希望您考虑一下我们在使用 Core Data 时:我们使用 @FetchRequest 属性包装器查询我们的数据,但我还向您展示了如何直接使用 FetchRequest 结构体...对于许多属性包装器而言,该结构体与包装器本身具有相同的名称,但是使用 @FetchRequest 时我向您展示了我们实际上是如何实际读取其中的包装值——获取的结果,而不是请求本身。...这意味着当我们使用 @State 来包装字符串时,最终得到的实际属性类型是 State。...那么我们该如何解决——我们如何将一些功能附加到包装的属性上?

    1.7K10

    iOS开发实战-时光记账Demo 本地数据库版效果分析Demo地址

    思维推导 2.文件结构 大致框架想好后就可以着手开始准备了 数据库管理:coreData 视图管理:navigationcontroller 暂时没有使用cocoapods导入第三方的数据库管理框架...view UICollectionView展示账单类型 自定义View计算器界面计算存储结果 model UICollectionViewCell模型 使用了plist和KVC转字典 controller...= [Tally fetchRequest]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"identity = %...有则使用无则创建 NSFetchRequest *fdate = [TallyType fetchRequest]; NSPredicate *p = [NSPredicate...这里用runtime方法为uibutton分类给时间线上的btn添加了两个属性 keyWithBtn :用于存储日期 panelBtnType :用于存储按钮是修改还是删除 typedef enum

    2.4K20

    【IOS开发高级系列】CoreData专题

    3,Persistent Store Coordinator         Persistent Store Coordinator 相当于数据文件管理器,处理底层的对数据文件的读取与写入。...它可以有默认值,也可以使用正则表达式或其他条件对其值进行限定。一个属性可以是 optional 的。     ...通常我们将 controller 类(如:NSArrayController,NSTreeController)或其子类与 Managed Object Context 绑定,这样就方便我们动态地生成,...NSPredicate 不单可以和CORE DATA中的FetchRequest 配合使用。也可以与NSArray配合使用。...NSAsynchronousFetchRequest 初始化时需要传入两个参数赋值给属性:     1. completionBlock 属性,允许我们在抓取完成后执行回调block;     2. fetchRequest

    72550

    Swift Core Data 分阶段迁移

    虽然这种方法性能良好且运行良好,但很难维护,不适用于应用程序扩展,并且存在高度的错误风险。例如,对于每个需要自定义迁移的新模型,你需要定义一个映射模型,以定义如何将每个模型的现有版本迁移到新版本。...与之前的文章一样,我们想要将 Track 模型中的 json 属性转换为一个单独的实体,该实体将为每个曲目保存所有相关的艺术家信息。...将此属性转换也将使模型更灵活、更易于维护,因为我们将能够删除 json 属性本身和 artistName,而使用新的关系。...文件名需要与包中的 .mom 文件的名称匹配。我们定义了 didMigrateHandler 闭包,在模型迁移后调用。此时,新的模型版本可在上下文中使用,你可以填充其属性。...然后,我们将 JSON 字符串解码为 Song 对象,并为 JSON 中的每个艺术家创建一个新的 Artist 实体。

    10210

    在 Core Data 中查询和使用 count 的若干方法

    四、获取单条记录某对多关系的 count 数据 如果你的对象模型中设置了对多关系,调用关系属性的 count 方法,可以获取单条记录某对多关系的对象数量。...在对 count 读取需求频繁的情况下,是极为优秀的解决方案 derived 完整的派生属性使用方法,请参阅 如何在 Core Data 中使用 Derived 和 Transient 属性[3]。...八、使用 willSave 记录 count 数据 派生属性使用起来非常方便,但预置的方法有限。重写托管对象的 willSave 方法,可以获得更多的控制力。...当业务逻辑中有类似的需求时,可以考虑为托管对象预设适合分组的属性。属性的内容也可以通过派生或 willSave 来处理。...无法直接将其使用在 NSPredicate 中。

    4.7K20

    优化在 SwiftUI List 中显示大数据集的响应效率

    本文将通过一个优化列表视图的案例,展现在 SwiftUI 中查找问题、解决问题的思路,其中也会对 SwiftUI 视图的显式标识、@FetchRequest 的动态设置、List 的运作机制等内容有所涉及...Data 的性能 @FetchRequest 是 NSFetchedResultsController 的 SwiftUI 包装。...id 修饰符与视图的显式标识 想搞清楚为什么使用了 id 修饰符的视图会提前实例化,我们首先需要了解 id 修饰符的作用。...另外如果 id 的标识值发生变化,SwiftUI 将丢弃原视图(生命周期终止及重置状态)并重新创建新的视图。...不使用 @FetchRequest 或 NSFetchResultController 等动态管理方式,用数组来持有数据 通过设置 NSPredicate 、NSSortDescription 和 fetchRequest.fetchLimit

    9.3K20

    SwiftDataKit:让你在 SwiftData 中使用 Core Data 的高级功能

    SwiftData 预计会在未来很长一段时间内成为苹果生态系统的主要对象图管理和数据持久化解决方案,为开发者提供服务与支持。...如果我们能够提取出这些对象,在安全的环境中进行有限度的使用,就可以在 SwiftData 中使用 Core Data 的高级功能。...SwiftDataKit 根据前文的思路,我开发了 SwiftDataKit[4] 库,它允许开发者使用 SwiftData 组件背后的 Core Data 对象,以实现当前版本无法完成的功能。...使用 SwiftDataKit 时有几点需要注意: 尽管未声明 Core Data 版本的数据模型类型,但可以用字符串方式访问 Entity 和属性。...与 Core Data Stack 进行数据交换 如果直接操作 SwiftData 底层对象仍无法满足需求,则需要创建并行的 Core Data 数据模型和数据栈,并在 SwiftData 和 Core

    33940

    SwiftDataKit:让你在 SwiftData 中使用 Core Data 的高级功能

    SwiftData 预计会在未来很长一段时间内成为苹果生态系统的主要对象图管理和数据持久化解决方案,为开发者提供服务与支持。...如果我们能够提取出这些对象,在安全的环境中进行有限度的使用,就可以在 SwiftData 中使用 Core Data 的高级功能。...SwiftDataKit 根据前文的思路,我开发了 SwiftDataKit[4] 库,它允许开发者使用 SwiftData 组件背后的 Core Data 对象,以实现当前版本无法完成的功能。...使用 SwiftDataKit 时有几点需要注意: 尽管未声明 Core Data 版本的数据模型类型,但可以用字符串方式访问 Entity 和属性。...与 Core Data Stack 进行数据交换 如果直接操作 SwiftData 底层对象仍无法满足需求,则需要创建并行的 Core Data 数据模型和数据栈,并在 SwiftData 和 Core

    33820

    KVC原理与数据筛选

    最后举例说明KVC使用的场景和高级应用。 01 前言 在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?...从设计稿出发,提升页面搭建效率,亟需解决的核心问题有: key-value-coding:键值编码,一种可以通过键名间接访问和赋值对象属性的机制; KVC是通过NSObject、NSArray、NSDictionary...那么上面的例子是如何出现的呢?明明传入的是字符串,最后赋值的时候转变为访问器方法所对应的类型?让我们继续刨根问底!...DSKeyValueSetter对象已经生成,即确定了发送消息的对象object、访问器方法名SEL、访问器函数指针IMP、以及使用KVC时传入的Key和Value。...从设计稿出发,提升页面搭建效率,亟需解决的核心问题有: 修改数组中对象的属性 [array valueForKeyPath:@"uppercaseString"] 利用KVC可以批量修改属性的成员变量值

    88320

    如何在 Core Data 中使用 Derived 和 Transient 属性

    作为托管对象定义的一部分,Core Data 会跟踪 Transient 属性的变化,并设置对应的托管对象和托管对象上下文状态,但属性中的内容将不会被保存到持久化存储器中,也不会在持久化存储中创建对应的字段...使用 Transient 属性,Core Data 在该属性内容发生变化时将托管对象实例的 hasChanges 以及托管对象上下文的 hasChanges 设置为 true,这样无论是@FetchRequest...:NSSnapshotEventType)从快照中载入实例时 在这些方法中设置 Transient 或其他属性时,应使用原始访问器方法来设置数据,避免触发 KVO 观察器通知。...因为使用了@FetchRequest,因此在复制过程中的 1-2 秒钟,UI 列表中会出现两个同样的数据记录,会给使用者带来困惑。...hasPersistentChangedValues•不要在 NSPredicate 中使用 transient 属性作为限制条件 @FetchRequest(entity: Test.entity

    1K20

    Ask Apple 2022 中与 Core Data 有关的问答

    如果你对查询有特别的需求的话,可以将枚举类型中关联数据打散,在实体中,将所有的关联值都定义成属性,并增加一个与枚举对应的类型属性,在托管对象中定义一个枚举类型的计算属性,通过它对数据进行转换。...A:在每个版本中添加一个新的托管对象模型会更安全,但是如果您从一个版本到另一个版本的更改经过充分测试以表明适用于轻量级迁移推断,那么单个托管对象模型就足够了。...让单一状态框架与 @FetchRequest 更好地结合目前仍是一个课题。...动态修改 @FetchRequest 的配置Q:在 SwiftUI 应用程序中,如何基于 @AppStorage 值创建 @FetchRequest?...A:@FetchRequest 的谓词属性是一个 Binding,它会在更改时重绘视图。从 Swift 3.0 开始,FetchRequest 支持在视图中动态修改它的谓词和排序描述。

    2.9K20

    只在视图 Body 中生存的变量

    SwiftUI 通过调用视图实例的 body 属性来获取视图值。...在 View 协议中,body 被属性包装器 @ViewBuilder 所标注,这意味着,通常我们只能在 body 中使用 ViewBuilder 认可的 Expression 来声明视图( 如果显式使用...不过就和通过 let _ = print("update") 能够帮助我们了解视图的动态一样,掌握了在 body 中通过 var 创建变量及应用的方法,也将有助于开发者更好地理解 SwiftUI 视图的求值逻辑并掌握其时机...场景一 前几天在 聊天室中有这个一个讨论: image-20230321195140004 由于 @FetchRequest 的返回类型 FetchedResults 并不支持索引,因此为了给每个对象添加一个序号...在本例中,渲染成我们看到的首行数据之前, offset 已被调用过 14 次,与当前的数据量( 13 )非常接近。FetchRequest 导致了上述的重复调用。

    69710

    iOS-谓词的使用详解import typedef NS_ENUM(NSInteger, PersonSex) {

    NSArray集合,返回符合条件的元素组成的新集合 - NSMutableArray提供了如下方法使用谓词来过滤集合 `- (void)filterUsingPredicate:(NSPredicate...>通过上面的描述可以看出,使用谓词过滤不可变集合和可变集合的区别是:过滤不可变集合时,会返回符合条件的集合元素组成的新集合;过滤可变集合时,没有返回值,会直接剔除不符合条件的集合元素 下面让我们来看几个例子...可以很快的从数组中选出符合条件的对象。...首先如果我们想在谓词表达式中使用变量,那么我们需要了解下列两种占位符: ` %K`:用于动态传入属性名 `%@`:用于动态设置属性值 其实相当于变量名与变量值,除此之外,还可以在谓词表达式中使用动态改变的属性值...`✨✨本文借鉴了很多前辈的文章,如果有不对的地方请指正,欢迎大家一起交流学习 xx_cc.`

    1.6K50

    架构之路 (七) —— iOS App的SOLID原则(一)

    目前,您应用的所有类都直接使用 ExpenseModel。您不能在不定义持久容器的情况下创建此类的实例。最好将与 Core Data 设置和预览相关的属性组合在一起。...在重构的后期,您将能够完全删除这些预览支持对象,并用更有条理的内容替换它们。 注意:static属性默认是惰性的。在您使用它们之前,它们永远不会被分配到内存中。...这是一个相当复杂的努力,只是为了显示一些属性。 现在,视图依赖于一个抽象协议,您可以使用 Core Data 模型或简单的旧结构来实现它。...如果您将 AddExpenseView 与另一个符合 SaveEntryProtocol 的对象一起提供,但在存储条目之前执行一些验证,它将影响应用程序的整体行为,因为 AddExpenseView 不期望这种行为...它现在可以自由使用任何类型的存储,只需对您的代码进行最少的更改。 3) 添加新报告类型是在枚举中添加新值的问题。 4) 创建预览和测试比以前容易得多,而且您不再需要任何复杂的模拟对象。

    4.7K10

    如何结合 Core Data 和 SwiftUI

    首先,我们需要打开 Bookworm.xcdatamodeld 并开始使用 Xcode 的模型编辑器描述我们的数据。...我们需要确保该获取请求随着时间的推移保持最新,以便在创建或删除学生时,我们的 UI 保持同步。 SwiftUI 有一个解决方案,而且——您猜对了——这是另一个属性包装器。...如果我们对 Core Data 说“这不是必须的”(您可以在模型编辑器中完成),它仍然会生成可选的 Swift 属性,因为所有 Core Data 关心的是属性在保存时具有值——在其他时间它们可以为 nil...为了解决这个问题,我们将在列表下方创建一个按钮,每次点击都会添加一个新的随机学生,但是首先我们需要一个新属性来存储托管对象上下文。 让我重申一下,因为这很重要。...更好的是,它已经将其添加到 SwiftUI 环境中,这就是@FetchRequest属性包装器起作用的原因——它使用了环境中可用的任何托管对象上下文。

    11.8K30
    领券