@@ -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-
5454final 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