ViewModelでユーザー情報を取得するAPIを呼び、Modelに格納し、Viewに連携してあげたいです。
1つ目のやり方は成功したものの、コードを綺麗にするために2つ目のやり方を試したら失敗しました。
ご助言いただけますと幸いです。(MVVMアーキテクチャにおいて何かタブーなことをやっているのかもしれません。。)
何卒よろしくお願いいたします。
成功したコード
ViewModel
class AuthViewModel: ObservableObject { @Published var userMe: User? //UserはユーザーIDや名前など諸々の情報が入るModelのStructです。 init() {//アプリが開かれた瞬間にinitされる fetchUserMe() } func fetchUserMe() { //API通信 中略 self.userMe = try JSONDecoder().decode(User.self, from: data) } }
View
//このViewは、NavigationLinkで遷移する先となる子Viewです。親Viewは省略させていただきます。 struct ProfileHeaderView: View { @EnvironmentObject var viewModel: AuthViewModel var body: some View { HStack { Text( viewModel.userMe?.usersName ?? "nil") } }
View
@main struct FriendQA_SwiftUIApp: App { @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate var body: some Scene { WindowGroup { ContentView().environmentObject(AuthViewModel.shared) } } }
エラーになったコード
上記でうまくいくものの、AuthViewModelには既にたくさんの関数を書いてしまってごちゃごちゃしているので、
fetchUserMe関数を違うView Modelに移したいと思い、下記のコードに変えましたが、うまくいきませんでした。
ViewModel
class AuthViewModel: ObservableObject { @ObservedObject var fetchUsersViewModel = FetchUsersViewModel() init() { //アプリが開かれた瞬間にinitされる fetchUsersViewModel.fetchUserMe() } }
ViewModel
class FetchUsersViewModel: ObservableObject { @Published var userMe: User? func fetchUserMe() { //API通信 中略 self.userMe = try JSONDecoder().decode(User.self, from: data) print(self.userMe) //ちゃんと中身も出力される } }
View
struct ProfileHeaderView: View { @ObservedObject var fetchUsersViewModel = FetchUsersViewModel() var body: some View { HStack { Text(fetchUsersViewModel.userMe?.usersName ?? "nil") //nilになってしまう Text($fetchUsersViewModel.userMe.wrappedValue?.usersName ?? "nil") //nilになってしまう } }
最後まで読んでいただきありがとうございます。お手数ですが、お力添えいただけますと幸いです。
まだ回答がついていません
会員登録して回答してみよう