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 { .onAppear {
articleIconImageLoader.loadImage(for: timelineItem.article) articleIconImageLoader.loadImage(for: timelineItem.article)

View File

@ -55,6 +55,14 @@ class TimelineModel: ObservableObject {
fetchAndReplaceArticlesAsync() 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 // MARK: Private
@ -112,11 +120,18 @@ private extension TimelineModel {
func replaceArticles(with unsortedArticles: Set<Article>) { func replaceArticles(with unsortedArticles: Set<Article>) {
articles = Array(unsortedArticles).sortedByDate(sortDirection ? .orderedDescending : .orderedAscending, groupByFeed: groupByFeed) 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 // 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 // MARK: - Notifications

View File

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