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

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

本文通过一个优化列表视图案例,展现在 SwiftUI 中查找问题、解决问题思路,其中也会对 SwiftUI 视图显式标识、@FetchRequest 动态设置、List 运作机制等内容有所涉及...按照正常逻辑,进入列表视图 ListEachRowHasID 后 List 只应该实例化十几个 ItemRow 视图 ( 按屏幕显示需要 ),即便使用 scrollTo 滚动到列表底部,List...另外如果 id 标识值发生变化,SwiftUI 丢弃原视图(生命周期终止及重置状态)并重新创建新视图。...但一旦为这些视图添加了 id 修饰符,这些视图无法享受到 List 提供优化能力 ( List 只会对 ForEach 中内容进行优化)。..., animation: .default ) private var items: FetchedResults // 在视图中切换 SortDescriptors

9.1K20
您找到你想要的搜索结果了吗?
是的
没有找到

如何在Xcode下预览含有Core Data元素SwiftUI视图

导致视图无法预览原因不仅仅是当前视图中代码 同标准模拟运行项目一样,在针对某个视图进行预览时,预览模拟需要项目整体代码均能够正常编译。...SwiftUI预设了大量同系统有关环境值,通过设置或响应这些数据,我们可以修改系统配置或读取系统信息。 SwiftUI视图采用树状结构组织,在任意节点视图上注入环境数据都将影响该节点所有视图。...预览也是模拟,会执行应用程序全部代码。App执行出错后,所有的视图都不能正常预览。...SwiftUI通常采用Redux开发模式,通过获取到Core Data数据转换成标准Swift结构从而避免在视图中使用托管对象上下文或托管对象。...通过为此种类型视图添加一个专门用来处理数据视图,可以有效两种逻辑分割开来。本例仅为演示,通常Connect视图数据准备工作会复杂多。

5.1K10

Ask Apple 2022 中与 Core Data 有关问答

很遗憾, Core Data 并没有提供直接返回这些文件 URL API( 或 BLOB 转换成以某种 URL 访问方式 ),因此,需要将数据以 URL 方式进行传递时,就需要先将数据写到临时目录后才能进行...您可以通过 @FetchRequest[8] 从存储中获取检索结果。@FetchRequest 是个让人又爱又恨东西。它很好用,几乎是在视图中获取数据首选。...A:定义逆向关系使得管理你图表容易( 比如,设置一个“级”会自动为对象添加为一个“级” ),并且还允许你委托 Core Data 进行图表清理( 比如,你想删除一个 “发票” 同时也删除其所有...如果我可以创建一个带有与此 @AppStorage 值相关联谓词 @FetchRequest,则谓词将自动更新,并更新我视图。目前我无法做到这一点,哪种解决方法能获得类似的结果?...A:@FetchRequest 谓词属性是一个 Binding,它会在更改时重绘视图。从 Swift 3.0 开始,FetchRequest 支持在视图中动态修改它谓词和排序描述。

2.8K20

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

还是只使用一个 fetchRequest,然后数据保存在本地,并通过上述方法访问它( 应该是指第一种方式 )?我想知道这里最佳做法是什么。谢谢!A:一般来说,不同视图经常使用不同获取请求。...即使你在模型编辑中将属性( 例如字符串 )标记为非可选( 设定了默认值 ),但在从托管对象获取属性值时候,返回值仍会是 Optional 类型。...改成 String;2、声明一个非可选值计算属性,并在其中对可选值属性值进行处理;3、托管对象实例整体转换成对 SwiftUI 视图更加友好值类型。...数据手动排序Q:在我应用程序中,用户可以在表视图中通过拖放来重新排列项目。...筛选关系数据Q:我发现在 SwiftUI 中使用 @FetchRequest 是将用户界面与 Core Data 数据绑定很好手段。然而,在使用关系来获得同样无缝绑定时,我碰到了一个小问题。

3.2K20

SwiftUI 与 Core Data —— 数据获取

本文中我们探讨在 SwiftUI 视图中批量获取 Core Data 数据方式,并尝试创建一个可以使用 mock 数据 FetchRequest。...FetchRequest 获取 )由于 TCA Reducer 无法与视图存续期自动绑定,上面的可感知延迟在每次触发 onAppear 时都将出现最终,我决定放下心结,仍然采用在视图中使用类似...这将有两个作用:数据变化后引发与其绑定视图进行更新由于底层数据并不保存在视图中,因此在视图存续期中 SwiftUI 可以随时创建新视图描述实例而无需担心数据丢失虽然苹果没有公开 _makeProperty... SwiftUI视图存续期中重新创建视图描述实例时,自定义类型也一并重新创建在视图存续期中,如果 SwiftUI 创新创建了视图描述实例,那么无论视图描述( 符合 View 协议 Struct...这是由于一旦 SwiftUI 惰性容器中出现了多个 ForEach ,惰性容器丧失对子视图优化能力。任何数据变动,惰性容器都将对所有的视图进行更新而不是仅更新可见部分视图

4.6K30

ObservableObject研究

•在部分视图中可以结合SwiftUI通过其他包装属性如@FetchRequest状态局部化 后两项是利用SwiftUI特性,也可以不采用,完全采用单向数据流方式 基于以上方法,在SwiftUI...在SwiftUI下开发,无论是主观还是客观都需要你View表述精细化,用更多View来组成你最终视图,而不是把所有的代码都尽量写在同一个View上。...该ViewView如果使用了@Binding,也只对局部View树产生影响。另外也可以常用View修饰通过ViewModifier进行包装。...} } 我相信,下一步SwiftUI应该还会提供更多直接状态控制在局部包装。...通过使用属性包装,我们可以Publisher订阅和变量声明合二为一,进一步优化上述解决方案。

2.4K60

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

已经了解了 SwiftUI 如何通过使用 @State 属性包装变化数据存储在结构体中,如何使用 $ 状态绑定到UI控件值,以及更改 @state 包装属性时是如何自动让 SwiftUI 重新调用我们结构体...对于许多属性包装而言,该结构体与包装本身具有相同名称,但是使用 @FetchRequest 时我向您展示了我们实际上是如何实际读取其中包装值——获取结果,而不是请求本身。...之前我曾解释说,我们无法在视图中修改属性,因为它们是结构体,因此是固定。但是,现在您知道 @State 本身会生成一个结构体,因此我们面临一个难题:如何修改该结构体?...value is \(blurAmount)") } } 在表面上,状态为“ blurAmount 更改时,打印出它新值。”...但是,由于 @State 实际上会包装其内容,因此实际上是说,包装 blurAmount State 结构体更改时,请打印出新模糊量。 还在这儿?

1.7K10

SwiftUI + Core Data App 内存占用优化之旅

、惰性视图中视图生命周期、托管对象惰值特性以及持久化存储协调行缓存等内容有更多了解。...视图进入惰性容器可视区域时,SwiftUI 会调用它 onAppear 闭包,视图退出可视区域时,会调用 onDisappear 闭包。...不过通过实验中分析,这些数据肯定是被缓存,且在被加载后,并不会因为返回惰值而自动从内存中清除 因此,即使我们托管对象返回成惰值状态,也仅能节省极少内存占用( 在本例中几乎可以忽略不计 )。...根据上述原理,我们尝试如下过程: 在 onAppear 闭包中,通过私有上下文创建一个 Picture 对象 data 属性数据转换成 Image,并保存在视图中一个 Source of truth...总结 SwiftUI 惰性容器使用起来很方便,并且通过 @FetchRequest 与 Core Data 配合也很方便,这在一定程度上导致开发者有了轻视心理,认为 SwiftUI + Core Data

2.4K40

SwiftUI + Core Data App 内存占用优化之旅

、惰性视图中视图生命周期、托管对象惰值特性以及持久化存储协调行缓存等内容有更多了解。...视图进入惰性容器可视区域时,SwiftUI 会调用它 onAppear 闭包,视图退出可视区域时,会调用 onDisappear 闭包。...不过通过实验中分析,这些数据肯定是被缓存,且在被加载后,并不会因为返回惰值而自动从内存中清除 因此,即使我们托管对象返回成惰值状态,也仅能节省极少内存占用( 在本例中几乎可以忽略不计 )。...根据上述原理,我们尝试如下过程: 在 onAppear 闭包中,通过私有上下文创建一个 Picture 对象 data 属性数据转换成 Image,并保存在视图中一个 Source of truth...总结 SwiftUI 惰性容器使用起来很方便,并且通过 @FetchRequest 与 Core Data 配合也很方便,这在一定程度上导致开发者有了轻视心理,认为 SwiftUI + Core Data

1.2K10

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

其中,它基于 Swift 宏功能数据模型创建机制、类型安全谓词系统、依靠 Actor 实现线程安全以及与 Observation[3] 框架紧密结合,使得 SwiftData 符合现代编程需求...利用 NSManagedObjectContext 实现分组计数 在某些场景下,我们需要对数据进行分组后计数,比如统计不同出生年份学生人数。... PersistentModel 转换为 NSManagedObject,实现查询 在 Core Data 中,开发者可以通过创建查询(SubQuery)谓词,直接在 SQLite 端实现嵌套查询...通过 PersistentModel 转换成 NSManagedObject,我们可以用包含查询谓词提高效率: func getCollectCountByCategoryByKit(categoryName... NSManagedObject 转换为 PersistentModel 有人可能会问,我们只能用 SwiftDataKit 返回计数据吗?

28220

SwiftUI 布局 —— 尺寸( 上 )

第二阶段 —— 安置子民 在该阶段,视图根据 SwiftUI 布局系统提供屏幕区域( 由第一阶段计算得出 )为视图设置渲染位置和尺寸( 上方 5-6 )。...本节结合 SwiftUI 4.0 中 Layout 协议对布局过程涉及尺寸做详细介绍。...视图想获得视图在最大模式下需求尺寸时,会为其提供该模式建议尺寸 明确尺寸模式 非 0 或 infinity 数值。...x 50 作为需求尺寸返回视图 fixedSize() 为视图提供未指定模式建议尺寸 frame(minWidth: 100, maxWidth: 300) 视图需求尺寸控制在指定范围中...,并将调整后尺寸作为需求尺寸返回视图 frame(idealWidth: 100, idealHeight: 100) 如果当前视图收到为未指定模式建议尺寸,则返回 100 x 100 需求尺寸

4.6K20

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

其中,它基于 Swift 宏功能数据模型创建机制、类型安全谓词系统、依靠 Actor 实现线程安全以及与 Observation[3] 框架紧密结合,使得 SwiftData 符合现代编程需求...利用 NSManagedObjectContext 实现分组计数 在某些场景下,我们需要对数据进行分组后计数,比如统计不同出生年份学生人数。... PersistentModel 转换为 NSManagedObject,实现查询 在 Core Data 中,开发者可以通过创建查询(SubQuery)谓词,直接在 SQLite 端实现嵌套查询...通过 PersistentModel 转换成 NSManagedObject,我们可以用包含查询谓词提高效率: func getCollectCountByCategoryByKit(categoryName... NSManagedObject 转换为 PersistentModel 有人可能会问,我们只能用 SwiftDataKit 返回计数据吗?

27840

探讨 SwiftUI几个关键属性包装

在这篇文章中,我们探讨几个在 SwiftUI 开发中经常使用且至关重要属性包装。本文旨在提供对这些属性包装主要功能和使用注意事项概述,而非详尽使用指南。...详见 避免 SwiftUI 视图重复计算[7]。 如果不需要在当前视图或在视图中(通过 @Binding )修改值,无需使用 @State。...它适用于需要在视图中直接修改视图中数据情况。 注意事项 应当谨慎使用 @Binding,视图只需响应数据变化而无需修改时,无需使用 @Binding。...典型应用场景 通常与 @StateObject 配合使用,视图使用 @StateObject 创建实例,视图通过 @ObservedObject 引入该实例,响应实例变化。...比如:PreferenceKey( 视图传递给视图 )、FocusedValueKey( 基于焦点传递值 )、LayoutValueKey( 视图传递给布局容器 )。

18810

React核心成员表示:JSX就是个错误

接下来我们通过一个简单「点击加一」计数来对比React与SwiftUI语法: React使用class语法: class Counter extends React.Component { state...同时,SwiftUI凭借强大编程能力,原生实现React当前并不支持功能: ? 比如,在React中,组件要改变组件状态,需要组件「状态」与「改变状态方法」传递给组件。...组件调用「改变状态方法」通知组件状态变化,组件再传递变化后「状态」组件。 这种方式在React中被称为「受控组件」。...在SwiftUI中,组件只需要将组件传递状态申明为@Binding,就能达到与组件该状态「双向绑定」效果。...比如上例counter: // 从 @State var counter = 0 // 变为 @Binding var counter 则计数接受组件传递counter状态,组件counter

1.2K30

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

SwiftUI 下,使用@FetchRequest 获取结果集,也可以使用上述方式。 如果设置了 fetchLimit ,可能无法获得正确 count 结果。...设置 fetchLimit 后返回不超过设定数量结果。...五、使用对多关系 count 设置谓词 对多关系 count 也经常被用来作为谓词条件使用。下面的代码返回 attachments(对多关系) count 大于 2 结果。...十二、分组后 count 数据用作筛选条件 如果想对方法十一中获取结果集进行筛选,除了通过代码操作结果数组外,利用 Core Data 对 having 支持,直接在 SQLite 中进行将更加高效...下面的代码返回 count 大于 40 结果。

4.6K20

SwiftUI 布局协议 - Part 1

早在2019年,我写了一篇文章SwiftUI 中 frame 表现[1],其中,我阐述了视图视图如何协调形成最终视图效果。那里描述许多情况需要通过观察不同测试结果去猜测。...就像我在以前文章 SwiftUI 中 frame 表现 所描述那样,在布局过程中,视图视图提供一个尺寸,但最终还是由视图决定如何绘制自己。然后,它将此传达视图,以便采取相应动作。...在这 120pt 中,文本只需要 74,并传达视图视图现在可以拿走多余 46pt 其他视图用。因为其他视图是图形,所以它们可以接收给它们一切东西。...将会调用 sizeThatFits 方法决定我们布局容器尺寸,当我们写这个方法我们应该认为我们既是视图又是视图:当作为视图时需要询问视图尺寸,当我们是视图时,要基于我们视图回复告诉视图需要尺寸... sizeThatFits 方法在给定维度中(即宽度或高度)收到建议尺寸为 nil 时,我们应该返回容器理想尺寸。收到建议尺寸为0.0时,我们应该返回容器最小尺寸。

3.2K10

避免 SwiftUI 视图重复计算

SwiftUI 视图加载到视图树时,通过调用 _makeProperty 完成数据保存到托管数据池以及在属性图中创建关联操作,并将数据在托管数据池中引用保存在 _location ( AnyLocation... SwiftUI 视图视图树上删除时,会一并完成对 SwiftUI 数据池以及关联清理工作。如此,使用 State 包装变量,其存续期将与视图存续期保持完全一致。...这是因为,我们 Student 类型作为参数传递给了视图SwiftUI 在比对实例时候,并不会关心子视图中具体使用了 student 中哪个属性,只要 student 发生了变化,那么就会重新计算...sendID 方法, store 排除在外 } 图片 事件源 为了全面地向 SwiftUI life cycle 转型,苹果为 SwiftUI 提供了一系列可以直接在视图中处理事件视图修饰,例如:...,我希望大家关注点集中于这些技巧在背后对应原理。

9.2K81

掌握 ViewThatFits

ViewThatFits 按照你提供给初始化顺序评估其视图。它选择在受限轴上理想尺寸适应建议尺寸第一个视图。这意味着你按照优先级顺序提供视图。...ViewThatFits 向视图查询其理想尺寸(根据未指定建议尺寸返回需求尺寸)。 根据受限轴设置,在选择受限轴上,比较视图理想尺寸和 ViewThatFits 视图给出建议尺寸。...ViewThatFits 视图给出建议尺寸作为自己建议尺寸传递给选择视图,并获得该视图在明确建议尺寸下需求尺寸。...ViewThatFits 将上一步获得需求尺寸作为自己需求尺寸返回视图。...就布局而言,"理想尺寸"指的是视图以未指定模式提供建议尺寸时,视图返回需求尺寸。

15710
领券