perf: optimize Progress tab with O(1) lookups and loading state
Replace O(n) linear searches with dictionary lookups in ProgressViewModel and ProgressTabView. Add loading spinner while data loads. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -16,7 +16,7 @@ final class ProgressViewModel {
|
||||
// MARK: - State
|
||||
|
||||
var selectedSport: Sport = .mlb
|
||||
var isLoading = false
|
||||
var isLoading = true
|
||||
var error: Error?
|
||||
var errorMessage: String?
|
||||
|
||||
@@ -42,10 +42,8 @@ final class ProgressViewModel {
|
||||
visits
|
||||
.filter { $0.sportEnum == selectedSport }
|
||||
.compactMap { visit -> String? in
|
||||
// Match visit's canonical stadium ID to a stadium
|
||||
stadiums.first { stadium in
|
||||
stadium.id == visit.stadiumId
|
||||
}?.id
|
||||
// O(1) dictionary lookup via DataProvider
|
||||
dataProvider.stadium(for: visit.stadiumId)?.id
|
||||
}
|
||||
)
|
||||
|
||||
@@ -120,7 +118,7 @@ final class ProgressViewModel {
|
||||
.sorted { $0.visitDate > $1.visitDate }
|
||||
.prefix(10)
|
||||
.compactMap { visit -> VisitSummary? in
|
||||
guard let stadium = stadiums.first(where: { $0.id == visit.stadiumId }),
|
||||
guard let stadium = dataProvider.stadium(for: visit.stadiumId),
|
||||
let sport = visit.sportEnum else {
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user