【问题标题】:SwiftUI List and Lazy loadingSwiftUI 列表和延迟加载
【发布时间】:2020-11-05 11:21:33
【问题描述】:

我创建了一个简单的 SwiftUI 应用程序,它在列表中显示来自网络的图像。所有图像都在后台加载。此时,一切都按预期工作。但是,如果在加载过程中,某个 State 变量确实触发了,我的所有单元格都会重新初始化。

让我们看看代码:

struct ImageView: View {

   @ObservedObject var imageLoader = ImageLoader()

   var body: some View {

        VStack {

            if self.imageLoader.isLoaded {

               DisplayImage(self.imageLoader.image)
            } else {

               Text("Loading...")
            }
        }
        .onAppear {

            self.imageLoader.loadImage()
        }
   }
}

struct TableView: View {
   
   @State var someTrigger: Bool = false;

    var body: some View {

       List {

           ForEach( someCollection, id: \.self) {

              ImageView()
           }
       }
    }
}

因此,如果在加载图像时触发了“someTrigger”,则所有单元格将重新初始化,imageLoader 将重新初始化,.onAppear 将不会被调用,图像将不会加载。

这是预期的行为吗?在那种情况下,我就不能以这种方式用一些后台任务来初始化我的模型?

提前致谢。

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

    我认为这可以通过传入 imageLoader 而不是在视图本身中初始化它来解决。我实际上建议让集合对象有一个ImageLoader,它会更新一些@Published 图像属性。尝试设置模型来完成所有繁重的工作,让视图只声明模型的每个状态应该是什么。

    【讨论】:

      【解决方案2】:

      SwiftUI 2.0

      改用StateObject wrapper,它将允许不重新创建加载器

      struct ImageView: View {
         @StateObject var imageLoader = ImageLoader()
      

      SwiftUI 1.0

      可能的解决方案(可能取决于您的真实代码)是通过某些属性(例如,仅id)明确地使ImageView 相等,即。不包括 imageLoader 本身。这可以使渲染引擎有机会在状态更改时不替换 ImageView

      例如

      struct ImageView: View, Equatable {
          static func == (lhs: Self, rhs: Self) -> Bool {
              lhs.url == rhs.url
          }
      
          let url: URL // some unique property
          @ObservedObject var imageLoader = ImageLoader()
      
          // ... other code
      }
      

      并使用

         ForEach( someCollection, id: \.self) {
            ImageView().equatable()       // << here !!
         }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-19
        • 1970-01-01
        • 2014-04-01
        • 2018-06-24
        • 2016-12-14
        • 2019-02-12
        • 2011-02-16
        • 1970-01-01
        相关资源
        最近更新 更多