Skip to content

Commit 05c8c28

Browse files
Fixed concurrency
1 parent 345bcdf commit 05c8c28

1 file changed

Lines changed: 28 additions & 13 deletions

File tree

SwiftUIExamples/SwiftUIExamples/Combine/LoginView.swift

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ final class LoginService: Sendable {
4949
}
5050

5151
// MARK: - ViewModel
52+
// Note # ObservableObject + @Published ≠ Sendable They’re designed for @MainActor use.
5253
@MainActor
53-
5454
final class LoginViewModel: ObservableObject {
5555
@Published var username: String = ""
5656
@Published var password: String = ""
@@ -65,24 +65,39 @@ final class LoginViewModel: ObservableObject {
6565
loginService.loginStatus
6666
.receive(on: DispatchQueue.main)
6767
.sink { [weak self] result in
68-
self?.isLoading = false
69-
switch result {
70-
case .success(let user):
71-
self?.isLoggedIn = true
72-
self?.errorMessage = nil
73-
print("🎉 Logged in as \(user.username)")
74-
case .failure(let error):
75-
self?.errorMessage = error.localizedDescription
76-
}
68+
self?.handleLoginResult(result)
7769
}
7870
.store(in: &cancellables)
7971
}
8072

81-
func login() async {
73+
func login() {
8274
errorMessage = nil
8375
isLoading = true
84-
Task.detached { [self] in
85-
await self.loginService.login(username: username, password: password)
76+
77+
Task {
78+
await performLogin()
79+
}
80+
// Option #2
81+
/**
82+
Task.detached { [self] in
83+
await self.loginService.login(username: username, password: password)
84+
}
85+
*/
86+
}
87+
88+
private nonisolated func performLogin() async {
89+
await loginService.login(username: username, password: password)
90+
}
91+
92+
private func handleLoginResult(_ result: Result<User, LoginError>) {
93+
isLoading = false
94+
switch result {
95+
case .success(let user):
96+
isLoggedIn = true
97+
errorMessage = nil
98+
print("🎉 Logged in as \(user.username)")
99+
case .failure(let error):
100+
errorMessage = error.localizedDescription
86101
}
87102
}
88103
}

0 commit comments

Comments
 (0)