【发布时间】: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