Skip to content

Commit 8ddcade

Browse files
NavigateAndLoad: Cancel loading on dismiss (#757)
* NavigateAndLoad: Cancel loading on dismiss * Update Examples/CaseStudies/SwiftUICaseStudies/03-Navigation-NavigateAndLoad.swift Co-authored-by: Stephen Celis <[email protected]> * Update Examples/CaseStudies/SwiftUICaseStudies/03-Navigation-Sheet-PresentAndLoad.swift Co-authored-by: Stephen Celis <[email protected]> * Add cancellation to UIKitCaseStudies/NavigateAndLoad.swift * Add cancellation to LoadThenNavigate studies Co-authored-by: Stephen Celis <[email protected]>
1 parent 8e32e15 commit 8ddcade

7 files changed

+50
-7
lines changed

Examples/CaseStudies/SwiftUICaseStudies/03-Navigation-Lists-LoadThenNavigate.swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ struct LoadThenNavigateListState: Equatable {
2727

2828
enum LoadThenNavigateListAction: Equatable {
2929
case counter(CounterAction)
30+
case onDisappear
3031
case setNavigation(selection: UUID?)
3132
case setNavigationSelectionDelayCompleted(UUID)
3233
}
@@ -58,12 +59,15 @@ let loadThenNavigateListReducer =
5859
case .counter:
5960
return .none
6061

61-
case let .setNavigation(selection: .some(id)):
62-
for index in state.rows.indices {
63-
state.rows[index].isActivityIndicatorVisible = state.rows[index].id == id
62+
case .onDisappear:
63+
return .cancel(id: CancelId())
64+
65+
case let .setNavigation(selection: .some(navigatedId)):
66+
for row in state.rows {
67+
state.rows[id: row.id]?.isActivityIndicatorVisible = row.id == navigatedId
6468
}
6569

66-
return Effect(value: .setNavigationSelectionDelayCompleted(id))
70+
return Effect(value: .setNavigationSelectionDelayCompleted(navigatedId))
6771
.delay(1, on: environment.mainQueue)
6872
.cancellable(id: CancelId(), cancelInFlight: true)
6973

@@ -119,6 +123,7 @@ struct LoadThenNavigateListView: View {
119123
}
120124
}
121125
.navigationBarTitle("Load then navigate")
126+
.onDisappear { viewStore.send(.onDisappear) }
122127
}
123128
}
124129
}

Examples/CaseStudies/SwiftUICaseStudies/03-Navigation-LoadThenNavigate.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ struct LoadThenNavigateState: Equatable {
1818
}
1919

2020
enum LoadThenNavigateAction: Equatable {
21+
case onDisappear
2122
case optionalCounter(CounterAction)
2223
case setNavigation(isActive: Bool)
2324
case setNavigationIsActiveDelayCompleted
@@ -39,11 +40,19 @@ let loadThenNavigateReducer =
3940
with: Reducer<
4041
LoadThenNavigateState, LoadThenNavigateAction, LoadThenNavigateEnvironment
4142
> { state, action, environment in
43+
44+
struct CancelId: Hashable {}
45+
4246
switch action {
47+
48+
case .onDisappear:
49+
return .cancel(id: CancelId())
50+
4351
case .setNavigation(isActive: true):
4452
state.isActivityIndicatorVisible = true
4553
return Effect(value: .setNavigationIsActiveDelayCompleted)
4654
.delay(1, on: environment.mainQueue)
55+
.cancellable(id: CancelId())
4756

4857
case .setNavigation(isActive: false):
4958
state.optionalCounter = nil
@@ -90,6 +99,7 @@ struct LoadThenNavigateView: View {
9099
}
91100
}
92101
}
102+
.onDisappear { viewStore.send(.onDisappear) }
93103
}
94104
.navigationBarTitle("Load then navigate")
95105
}

Examples/CaseStudies/SwiftUICaseStudies/03-Navigation-NavigateAndLoad.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,18 @@ let navigateAndLoadReducer =
3838
with: Reducer<
3939
NavigateAndLoadState, NavigateAndLoadAction, NavigateAndLoadEnvironment
4040
> { state, action, environment in
41+
struct CancelId: Hashable {}
4142
switch action {
4243
case .setNavigation(isActive: true):
4344
state.isNavigationActive = true
4445
return Effect(value: .setNavigationIsActiveDelayCompleted)
4546
.delay(1, on: environment.mainQueue)
47+
.cancellable(id: CancelId())
4648

4749
case .setNavigation(isActive: false):
4850
state.isNavigationActive = false
4951
state.optionalCounter = nil
50-
return .none
52+
return .cancel(id: CancelId())
5153

5254
case .setNavigationIsActiveDelayCompleted:
5355
state.optionalCounter = CounterState()

Examples/CaseStudies/SwiftUICaseStudies/03-Navigation-Sheet-LoadThenPresent.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ struct LoadThenPresentState: Equatable {
1818
}
1919

2020
enum LoadThenPresentAction {
21+
case onDisappear
2122
case optionalCounter(CounterAction)
2223
case setSheet(isPresented: Bool)
2324
case setSheetIsPresentedDelayCompleted
@@ -39,11 +40,19 @@ let loadThenPresentReducer =
3940
with: Reducer<
4041
LoadThenPresentState, LoadThenPresentAction, LoadThenPresentEnvironment
4142
> { state, action, environment in
43+
44+
struct CancelId: Hashable {}
45+
4246
switch action {
47+
48+
case .onDisappear:
49+
return .cancel(id: CancelId())
50+
4351
case .setSheet(isPresented: true):
4452
state.isActivityIndicatorVisible = true
4553
return Effect(value: .setSheetIsPresentedDelayCompleted)
4654
.delay(1, on: environment.mainQueue)
55+
.cancellable(id: CancelId())
4756

4857
case .setSheet(isPresented: false):
4958
state.optionalCounter = nil
@@ -93,6 +102,7 @@ struct LoadThenPresentView: View {
93102
)
94103
}
95104
.navigationBarTitle("Load and present")
105+
.onDisappear { viewStore.send(.onDisappear) }
96106
}
97107
}
98108
}

Examples/CaseStudies/SwiftUICaseStudies/03-Navigation-Sheet-PresentAndLoad.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,18 @@ let presentAndLoadReducer =
3636
with: Reducer<
3737
PresentAndLoadState, PresentAndLoadAction, PresentAndLoadEnvironment
3838
> { state, action, environment in
39+
struct CancelId: Hashable {}
3940
switch action {
4041
case .setSheet(isPresented: true):
4142
state.isSheetPresented = true
4243
return Effect(value: .setSheetIsPresentedDelayCompleted)
4344
.delay(1, on: environment.mainQueue)
45+
.cancellable(id: CancelId())
4446

4547
case .setSheet(isPresented: false):
4648
state.isSheetPresented = false
4749
state.optionalCounter = nil
48-
return .none
50+
return .cancel(id: CancelId())
4951

5052
case .setSheetIsPresentedDelayCompleted:
5153
state.optionalCounter = CounterState()

Examples/CaseStudies/UIKitCaseStudies/LoadThenNavigate.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ struct LazyNavigationState: Equatable {
99
}
1010

1111
enum LazyNavigationAction: Equatable {
12+
case onDisappear
1213
case optionalCounter(CounterAction)
1314
case setNavigation(isActive: Bool)
1415
case setNavigationIsActiveDelayCompleted
@@ -30,11 +31,15 @@ let lazyNavigationReducer =
3031
with: Reducer<
3132
LazyNavigationState, LazyNavigationAction, LazyNavigationEnvironment
3233
> { state, action, environment in
34+
struct CancelId: Hashable {}
3335
switch action {
36+
case .onDisappear:
37+
return .cancel(id: CancelId())
3438
case .setNavigation(isActive: true):
3539
state.isActivityIndicatorHidden = false
3640
return Effect(value: .setNavigationIsActiveDelayCompleted)
3741
.delay(1, on: environment.mainQueue)
42+
.cancellable(id: CancelId()
3843
case .setNavigation(isActive: false):
3944
state.optionalCounter = nil
4045
return .none
@@ -116,6 +121,11 @@ class LazyNavigationViewController: UIViewController {
116121
@objc private func loadOptionalCounterTapped() {
117122
self.viewStore.send(.setNavigation(isActive: true))
118123
}
124+
125+
override func viewDidDisappear(_ animated: Bool) {
126+
super.viewDidDisappear(animated)
127+
self.viewStore.send(.onDisappear)
128+
}
119129
}
120130

121131
struct LazyNavigationViewController_Previews: PreviewProvider {

Examples/CaseStudies/UIKitCaseStudies/NavigateAndLoad.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,19 @@ let eagerNavigationReducer =
3030
with: Reducer<
3131
EagerNavigationState, EagerNavigationAction, EagerNavigationEnvironment
3232
> { state, action, environment in
33+
34+
struct CancelId: Hashable {}
35+
3336
switch action {
3437
case .setNavigation(isActive: true):
3538
state.isNavigationActive = true
3639
return Effect(value: .setNavigationIsActiveDelayCompleted)
3740
.delay(1, on: environment.mainQueue)
41+
.cancellable(id: CancelId()
3842
case .setNavigation(isActive: false):
3943
state.isNavigationActive = false
4044
state.optionalCounter = nil
41-
return .none
45+
return .cancel(id: CancelId())
4246
case .setNavigationIsActiveDelayCompleted:
4347
state.optionalCounter = CounterState()
4448
return .none

0 commit comments

Comments
 (0)