Revert to using List for timeline and use infinite scrolling technique to speed up timeline loads

This commit is contained in:
Maurice Parker 2020-07-02 17:36:50 -05:00
parent c6bd4cd6e3
commit 2292d04f91
3 changed files with 22 additions and 9 deletions

View File

@ -45,7 +45,6 @@ struct TimelineItemView: View {
}
}
}
Divider()
}
.onAppear {
articleIconImageLoader.loadImage(for: timelineItem.article)

View File

@ -55,6 +55,14 @@ class TimelineModel: ObservableObject {
fetchAndReplaceArticlesAsync()
}
// TODO: Replace this with ScrollViewReader if we have to keep it
func loadMoreTimelineItemsIfNecessary(_ timelineItem: TimelineItem) {
let thresholdIndex = timelineItems.index(timelineItems.endIndex, offsetBy: -10)
if timelineItems.firstIndex(where: { $0.id == timelineItem.id }) == thresholdIndex {
nextBatch()
}
}
}
// MARK: Private
@ -112,12 +120,19 @@ private extension TimelineModel {
func replaceArticles(with unsortedArticles: Set<Article>) {
articles = Array(unsortedArticles).sortedByDate(sortDirection ? .orderedDescending : .orderedAscending, groupByFeed: groupByFeed)
timelineItems = articles.map { TimelineItem(article: $0) }
timelineItems = [TimelineItem]()
nextBatch()
// TODO: Update unread counts and other item done in didSet on AppKit
}
func nextBatch() {
let rangeEndIndex = timelineItems.endIndex + 50 > articles.endIndex ? articles.endIndex : timelineItems.endIndex + 50
let range = timelineItems.endIndex..<rangeEndIndex
for i in range {
timelineItems.append(TimelineItem(article: articles[i]))
}
}
// MARK: - Notifications
}

View File

@ -13,12 +13,11 @@ struct TimelineView: View {
@EnvironmentObject private var timelineModel: TimelineModel
var body: some View {
ScrollView {
LazyVStack() {
ForEach(timelineModel.timelineItems) { timelineItem in
TimelineItemView(timelineItem: timelineItem)
List(timelineModel.timelineItems) { timelineItem in
TimelineItemView(timelineItem: timelineItem)
.onAppear {
timelineModel.loadMoreTimelineItemsIfNecessary(timelineItem)
}
}
}
}