swiftui - 为什么这个 SwiftUI LazyHStack 不断更新?
问题描述
我有大量URL
的图像。我将文件的缩略图显示在LazyVStack
. 我已经分别将“ThumbnailView”和“ThumbnailGenerator”封装在一个结构和一个类中。但是,当我运行代码时,我发现它一直在重新启动ThumbnailGenerator
s. 经过一番调查,我发现HStack
在主视图的层次结构中删除后问题就消失了。
关于为什么会发生这种情况的任何想法。(顺便说一句,我确实用 Apple 记录了这个,但我仍然觉得我自己在这里做错了。)
我已将代码剥离到这里的基本要素,用一个简单的 sleep 语句替换缩略图生成代码,以演示实际中的错误。用 in 运行它,HStack
它会连续打印出日期。把它拿出来,它按预期工作。
@main
struct ExperimentApp: App {
var body: some Scene {
WindowGroup {
LazyVIssue()
.frame(width: 200, height: 140)
.padding(100)
}
}
}
struct LazyVIssue: View {
var body: some View {
ScrollView {
LazyVStack {
ForEach(0..<10) { i in
HStack { /// <---- REMOVE THIS HSTACK AND IT WORKS
ThumbnailView()
Text("Filename \(i)")
}.padding()
}
}
}
}
}
struct ThumbnailView: View {
@StateObject private var thumbnailGenerator : ThumbnailGenerator
init() {
_thumbnailGenerator = StateObject(wrappedValue: ThumbnailGenerator())
}
var body: some View {
thumbnailGenerator.image
}
}
final class ThumbnailGenerator: ObservableObject {
var image : Image
init() {
print("Initiating", Date())
image = Image(systemName: "questionmark.circle.fill")
DispatchQueue.global(qos: .userInteractive).async { [weak self] in
guard let self = self else { return }
sleep(1) /// Simulate some work to fetch image
self.image = Image(systemName: "camera.circle.fill")
DispatchQueue.main.async {
self.objectWillChange.send()
}
}
}
}
解决方案
我不确定为什么会发生这种情况,但我也看到过类似这样的一些奇怪的事情发生。如果您在 ThumbnailView 初始化之外初始化 ThumbnailGenerator(),我相信问题就会消失。
init(generator: ThumbnailGenerator) {
_thumbnailGenerator = StateObject(wrappedValue: generator)
}
推荐阅读
- python-3.x - 根据 2 个(理想情况下推广到 n 个)任意分组规则对字母字符串列表进行聚类?
- php - 我需要在服务器上运行我作为任务编写的 PHP 脚本
- android - 如何使用 style.xml 文件更改 MaterialCardView 的背景颜色?
- python - 链接方法时在 Jupyter Notebook 中自动完成
- javascript - 是否可以在javascript中使用字符代码而不是<和>?
- python - 在 numpy - 我如何通过将正弦波与正弦和余弦相关来计算正弦波的相位和幅度?
- javascript - 将数组中的用户注册信息与用户登录输入进行比较
- angular - 刷新后 fxLayout 出现问题
- python - 在交互中通过正则表达式传递变量
- c - 用C计算圆的面积并在主脚本中调用它