wrap viewModel async call in Task

This commit is contained in:
Satindar Dhillon
2022-04-14 15:06:50 -07:00
parent 70c4b1c690
commit 98080719f3
3 changed files with 14 additions and 13 deletions

View File

@ -22,7 +22,7 @@ struct FeedCardNavigationLink: View {
.opacity(0)
.buttonStyle(PlainButtonStyle())
.onAppear {
Task { await viewModel.itemAppeared(item: item, dataService: dataService) }
viewModel.itemAppeared(item: item, dataService: dataService)
}
FeedCard(item: item)
}
@ -60,7 +60,7 @@ struct GridCardNavigationLink: View {
}
})
.onAppear {
Task { await viewModel.itemAppeared(item: item, dataService: dataService) }
viewModel.itemAppeared(item: item, dataService: dataService)
}
}
.aspectRatio(1.8, contentMode: .fill)

View File

@ -19,7 +19,7 @@ import Views
viewModel: viewModel
)
.refreshable {
Task { await viewModel.loadItems(dataService: dataService, isRefresh: true) }
viewModel.loadItems(dataService: dataService, isRefresh: true)
}
.searchable(
text: $viewModel.searchTerm,
@ -35,13 +35,13 @@ import Views
.onChange(of: viewModel.searchTerm) { _ in
// Maybe we should debounce this, but
// it feels like it works ok without
Task { await viewModel.loadItems(dataService: dataService, isRefresh: true) }
viewModel.loadItems(dataService: dataService, isRefresh: true)
}
.onChange(of: viewModel.selectedLabels) { _ in
Task { await viewModel.loadItems(dataService: dataService, isRefresh: true) }
viewModel.loadItems(dataService: dataService, isRefresh: true)
}
.onSubmit(of: .search) {
Task { await viewModel.loadItems(dataService: dataService, isRefresh: true) }
viewModel.loadItems(dataService: dataService, isRefresh: true)
}
.sheet(item: $viewModel.itemUnderLabelEdit) { item in
ApplyLabelsView(mode: .item(item)) { labels in
@ -54,7 +54,7 @@ import Views
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
// Don't refresh the list if the user is currently reading an article
if viewModel.selectedLinkItem == nil {
Task { await viewModel.loadItems(dataService: dataService, isRefresh: true) }
viewModel.loadItems(dataService: dataService, isRefresh: true)
}
}
.onReceive(NotificationCenter.default.publisher(for: Notification.Name("PushFeedItem"))) { notification in
@ -75,7 +75,7 @@ import Views
}
.onAppear {
if viewModel.items.isEmpty {
Task { await viewModel.loadItems(dataService: dataService, isRefresh: true) }
viewModel.loadItems(dataService: dataService, isRefresh: true)
}
}
.onChange(of: viewModel.selectedLinkItem) { _ in
@ -322,7 +322,7 @@ import Views
.onPreferenceChange(ScrollViewOffsetPreferenceKey.self) { offset in
DispatchQueue.main.async {
if !viewModel.isLoading, offset > 240 {
Task { await viewModel.loadItems(dataService: dataService, isRefresh: true) }
viewModel.loadItems(dataService: dataService, isRefresh: true)
}
}
}

View File

@ -36,14 +36,14 @@ import Views
init() {}
func itemAppeared(item: FeedItem, dataService: DataService) async {
func itemAppeared(item: FeedItem, dataService: DataService) {
if isLoading { return }
let itemIndex = items.firstIndex(where: { $0.id == item.id })
let thresholdIndex = items.index(items.endIndex, offsetBy: -5)
// Check if user has scrolled to the last five items in the list
if let itemIndex = itemIndex, itemIndex > thresholdIndex, items.count < thresholdIndex + 10 {
await loadItems(dataService: dataService, isRefresh: false)
Task { await loadItems(dataService: dataService, isRefresh: false) }
}
}
@ -51,7 +51,7 @@ import Views
items.insert(item, at: 0)
}
func loadItems(dataService: DataService, isRefresh: Bool) async {
func loadItems(dataService: DataService, isRefresh: Bool) {
// Clear offline highlights since we'll be populating new FeedItems with the correct highlights set
dataService.clearHighlights()
@ -61,8 +61,9 @@ import Views
isLoading = true
// Cache the viewer
if dataService.currentViewer == nil {
_ = try? await dataService.fetchViewer()
Task { _ = try? await dataService.fetchViewer() }
}
dataService.libraryItemsPublisher(