Skip to content

Commit 7e5992d

Browse files
Cacheing bugfix
1 parent dced40b commit 7e5992d

5 files changed

Lines changed: 30 additions & 8 deletions

File tree

Sources/LoadableView/Protocols/LoadableView/BaseLoadableView.swift

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,17 @@ public extension BaseLoadableView {
5151

5252
internal extension BaseLoadableView {
5353
@ViewBuilder
54-
func _buildBody() -> some View {
54+
func _buildBody(_ id: Any? = nil) -> some View {
5555
ZStack {
56-
switch vm.viewState {
57-
case .notLoaded:
58-
notLoaded()
59-
case .loaded(let element):
60-
loaded(element)
56+
if !vm.viewState.hasLoaded, let cached = vm._cached(id) {
57+
loaded(cached)
58+
} else {
59+
switch vm.viewState {
60+
case .notLoaded:
61+
notLoaded()
62+
case .loaded(let element):
63+
loaded(element)
64+
}
6165
}
6266
InternalLoadingView(vm.overlayState) {
6367
loading()

Sources/LoadableView/Protocols/LoadableView/BaseLoadableViewModel.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ public protocol BaseLoadableViewModel: ObservableObject, AnyObject {
3333

3434
// Note: - Used internally for observing LoadableViewObservables
3535
func _refresh(ifID id: UUID, showLoading: Bool)
36+
37+
func _cached(_ id: Any?) -> Element?
3638
}
3739

3840
public extension BaseLoadableViewModel {

Sources/LoadableView/Protocols/LoadableView/IDedLoadableView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public extension IDedLoadableView {
3232
public extension IDedLoadableView {
3333
@ViewBuilder
3434
var body: some View {
35-
_buildBody()
35+
_buildBody(id)
3636
.onChange(of: id) { oldValue, newValue in
3737
vm.idHasChanged(newValue, showLoading: true)
3838
}

Sources/LoadableView/Protocols/LoadableView/IDedLoadableViewModel.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,17 @@ public extension IDedLoadableViewModel {
6161
refresh(showLoading: showLoading)
6262
}
6363

64+
func _cached(_ id: Any?) -> Element? {
65+
guard let id = self.id ?? id as? ID else {
66+
return nil
67+
}
68+
if let cache, let cached = cache.value(forKey: id) {
69+
return cached
70+
} else {
71+
return nil
72+
}
73+
}
74+
6475
func initialLoad(id: ID) async throws {
6576
do {
6677
guard case .notLoaded = viewState else {
@@ -95,6 +106,7 @@ public extension IDedLoadableViewModel {
95106
throw LoadableViewError.noId
96107
}
97108
let item = try await load(id: id)
109+
cache?.insert(item, forKey: id)
98110
guard await shouldRefresh(viewState.loaded, newItem: item) else {
99111
return
100112
}

Sources/LoadableView/Protocols/LoadableView/LoadableViewModel.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@ public extension LoadableViewModel {
1313
func cancel() async {
1414
// Implement to cancel loading
1515
}
16-
16+
17+
func _cached(_ id: Any?) -> Element? {
18+
return nil
19+
}
20+
1721
func initialLoad() async {
1822
do {
1923
guard case .notLoaded = viewState else {

0 commit comments

Comments
 (0)