Skip to content

Commit ac81a63

Browse files
authored
BN-4308 [REFACTOR] Simplify view state refreshing
1 parent eead912 commit ac81a63

File tree

4 files changed

+12
-28
lines changed

4 files changed

+12
-28
lines changed

NetworkModuleSampleApp/NetworkModuleSampleApp.xcodeproj/project.pbxproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
2290A8E12995118F00067FFC /* StringExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2290A8E02995118F00067FFC /* StringExtensions.swift */; };
1818
2290A8E6299A62AE00067FFC /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2290A8E5299A62AE00067FFC /* Logging.swift */; };
1919
AD06FC26297FE93900A05C0F /* EpisodeHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD06FC25297FE93900A05C0F /* EpisodeHeaderView.swift */; };
20-
AD073F02297EC3DA007B8C89 /* NetworkModuleSampleAppApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD073F01297EC3DA007B8C89 /* NetworkModuleSampleAppApp.swift */; };
20+
AD073F02297EC3DA007B8C89 /* NetworkModuleSampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD073F01297EC3DA007B8C89 /* NetworkModuleSampleApp.swift */; };
2121
AD073F06297EC3DC007B8C89 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AD073F05297EC3DC007B8C89 /* Assets.xcassets */; };
2222
AD073F09297EC3DC007B8C89 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AD073F08297EC3DC007B8C89 /* Preview Assets.xcassets */; };
2323
AD073F16297EC45A007B8C89 /* HomeScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD073F15297EC45A007B8C89 /* HomeScene.swift */; };
@@ -53,7 +53,7 @@
5353
22BD5043299B97BA009B301C /* NgNetworkModuleShowcase.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = NgNetworkModuleShowcase.playground; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
5454
AD06FC25297FE93900A05C0F /* EpisodeHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EpisodeHeaderView.swift; sourceTree = "<group>"; };
5555
AD073EFE297EC3DA007B8C89 /* NetworkModuleSampleApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NetworkModuleSampleApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
56-
AD073F01297EC3DA007B8C89 /* NetworkModuleSampleAppApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkModuleSampleAppApp.swift; sourceTree = "<group>"; };
56+
AD073F01297EC3DA007B8C89 /* NetworkModuleSampleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkModuleSampleApp.swift; sourceTree = "<group>"; };
5757
AD073F05297EC3DC007B8C89 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
5858
AD073F08297EC3DC007B8C89 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
5959
AD073F15297EC45A007B8C89 /* HomeScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScene.swift; sourceTree = "<group>"; };
@@ -165,7 +165,7 @@
165165
ADC19E5E2981723700E26D25 /* PreviewMocks */,
166166
ADC19E3F29812F4C00E26D25 /* App */,
167167
AD073F14297EC439007B8C89 /* Scenes */,
168-
AD073F01297EC3DA007B8C89 /* NetworkModuleSampleAppApp.swift */,
168+
AD073F01297EC3DA007B8C89 /* NetworkModuleSampleApp.swift */,
169169
AD073F05297EC3DC007B8C89 /* Assets.xcassets */,
170170
AD073F07297EC3DC007B8C89 /* Preview Content */,
171171
);
@@ -485,7 +485,7 @@
485485
ADC19E5B29816AC100E26D25 /* EpisodeCharacterRowView.swift in Sources */,
486486
2260DF2029926F7500ED9386 /* GetEpisodesListRequest.swift in Sources */,
487487
ADC19E4B2981537E00E26D25 /* Routes.swift in Sources */,
488-
AD073F02297EC3DA007B8C89 /* NetworkModuleSampleAppApp.swift in Sources */,
488+
AD073F02297EC3DA007B8C89 /* NetworkModuleSampleApp.swift in Sources */,
489489
ADC19E602981724600E26D25 /* PreviewMocks.swift in Sources */,
490490
ADC19E44298130D000E26D25 /* EpisodeListViewModel.swift in Sources */,
491491
ADC19E4E2981584F00E26D25 /* EpisodeModel.swift in Sources */,

NetworkModuleSampleApp/NetworkModuleSampleApp/NetworkModuleSampleAppApp.swift renamed to NetworkModuleSampleApp/NetworkModuleSampleApp/NetworkModuleSampleApp.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
//
2-
// NetworkModuleSampleAppApp.swift
2+
// NetworkModuleSampleApp.swift
33
// Netguru iOS Network Module
44
//
55

66
import SwiftUI
77

88
@main
9-
struct NetworkModuleSampleAppApp: App {
9+
struct NetworkModuleSampleApp: App {
1010
var body: some Scene {
1111
WindowGroup {
1212
HomeScene()

NetworkModuleSampleApp/NetworkModuleSampleApp/Scenes/Episode/ViewModel/EpisodeViewModel.swift

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ private extension EpisodeViewModel {
108108
.store(in: &cancellables)
109109
}
110110

111-
func fetchCharacterDataUsingAsyncAwaitApi(urlRequest: URLRequest) async {
111+
@MainActor func fetchCharacterDataUsingAsyncAwaitApi(urlRequest: URLRequest) async {
112112
logNetworkInfo("--- [Async/Await] Request started: \(urlRequest.requestPath)")
113113
do {
114114
let characterModel = try await networkModule.performAndDecode(
@@ -117,10 +117,10 @@ private extension EpisodeViewModel {
117117
)
118118
characters.append(characterModel)
119119
logNetworkInfo("--- [Async/Await] Request completed: \(urlRequest.requestPath)")
120-
await updateByMainActor(viewState: .loaded(episode, characters))
120+
viewState = .loaded(episode, characters)
121121
} catch {
122122
logNetworkError("--- [Async/Await] Request error: \(error.localizedDescription)")
123-
await updateByMainActor(viewState: .error(episode, error))
123+
viewState = .error(episode, error)
124124
}
125125
}
126126

@@ -136,14 +136,6 @@ private extension EpisodeViewModel {
136136
tasks = []
137137
urlTasks = []
138138
}
139-
140-
func updateByMainActor(viewState: EpisodeViewState) async {
141-
// Discussion: Alternatively, you can just annotate `viewState` with @MainActor ...
142-
// ... to ensure it is updated on the Main Thread.
143-
await MainActor.run { [weak self] in
144-
self?.viewState = viewState
145-
}
146-
}
147139
}
148140

149141
private extension URLRequest {

NetworkModuleSampleApp/NetworkModuleSampleApp/Scenes/EpisodeList/ViewModels/EpisodeListViewModel.swift

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ private extension EpisodeListViewModel {
8080
.assign(to: &$viewState)
8181
}
8282

83-
func fetchEpisodesListUsingAsyncAwaitApi() async {
83+
@MainActor func fetchEpisodesListUsingAsyncAwaitApi() async {
8484
let request = GetEpisodesListRequest()
8585
logNetworkInfo("--- [Async/Await] Request started: \(request.path)")
8686
do {
@@ -89,18 +89,10 @@ private extension EpisodeListViewModel {
8989
responseType: [EpisodeModel].self
9090
)
9191
logNetworkInfo("--- Async/AwaitRequest completed: \(request.path)")
92-
await updateByMainActor(viewState: .loaded(episodes))
92+
viewState = .loaded(episodes)
9393
} catch {
9494
logNetworkError("--- Async/AwaitRequest error: \(error.localizedDescription)")
95-
await updateByMainActor(viewState: .error(error))
96-
}
97-
}
98-
99-
func updateByMainActor(viewState: EpisodeListViewState) async {
100-
// Discussion: Alternatively, you can just annotate `viewState` with @MainActor ...
101-
// ... to ensure it is updated on the Main Thread.
102-
await MainActor.run { [weak self] in
103-
self?.viewState = viewState
95+
viewState = .error(error)
10496
}
10597
}
10698
}

0 commit comments

Comments
 (0)