【问题标题】:SwiftUI load very long list in async waySwiftUI 以异步方式加载很长的列表
【发布时间】:2020-05-24 23:14:53
【问题描述】:

我有一个导航和详细视图,它发送日期(键)字典和​​结构数组(但结构并不重要,它包含字符串数组和其他内容。

如果我发送一个非常长的字典,应用程序会冻结在所选行中,并且一旦列表完成加载每条记录,就会出现详细信息。

struct DetailView: View {
    var selectedChat: [Date: [TextStruct]]? // you can try with [Date: [String]]? 

    var body: some View {

           List
           {                                    
              ForEach(self.selectedChat.keys.sorted(), id: \.self)
              { key in //section data
                  Section(header:                                                                                       
                     Text("\(self.selectedChat[key]![0].date)
                  {                                                                                                        
                        ForEach(self.selectedChat[key]!,  id:\.self) {sText in
                             // my ChatView(sText) ....                                      
                  }
               }
            }
     }

我尝试通过添加这个 var 在开始时加载一些行

@State private var dateAndText: [Date: [TextStruct]] = [:]

用 self.dateAndText 和 .onAppear 替换上面的代码 (self.selectedChat):

.onAppear {
    if let chat = self.selectedChat {

           let keysDateSorted = chat.allText.keys.sorted()
           self.chatLeader = chat.chatLeader

           for key in keysDateSorted.prefix(30) {
               self.dateAndText[key] = chat.allText[key]
           }


            DispatchQueue.global(qos: .utility).async {
                 self.dateAndText = chat.allText

                 self.progressBarValue = 1
            }

       }
}

使用此解决方案,一旦我推送该行,我立即可以看到前 30 条记录,这没问题,但是直到加载完所有记录后我才能滚动。我知道只有当用户在列表末尾滚动时才可以加载数组,但如果用户最后不滚动,我也想加载所有列表。

那么,有一种方法可以部分加载列表(例如每 100 条记录发送和更新数组)和异步方式(为了不冻结显示以防止糟糕的用户体验)?

【问题讨论】:

  • 它不是 SwiftUI 特定的......只是限制您在业务逻辑和模型中向用户显示的内容。仅使用 SwiftUI(或其他 ui 系统)进行演示。

标签: ios swift iphone list swiftui


【解决方案1】:

您几乎肯定会遇到 Paul Hudson 描述并修复的问题 here

SwiftUI 正在尝试为所有更改设置动画,因此如果您使用他的技巧解决该问题,它应该可以工作,但您将丢失列表更改之间的所有动画。 Apple 开发人员在 Twitter 上回应了他和 Dave DeLong 的讨论,他们说这绝对是他们希望解决的问题。

文章的tldr: 将.id(UUID()) 添加到List 的初始化程序的末尾。

【讨论】:

    猜你喜欢
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多