日本語版
最新ニュース
スポーツ

ios – データ更新のサイクル化

ビューモデルがあります @MainActor @Observable クラス SpenderGroupsViewModel { var SpenderGroups: [SpenderGroup]? var isFetching: Bool = true private let networkManager = NetworkManager.shared init() { Task { await fetchGroups() } } func fetchGroups() async { Guard !(networkManager.autCreds.auth_token ?? "").isEmpty else { print(…

ios – データ更新のサイクル化

ビューモデルがあります

@MainActor @Observable クラス SpenderGroupsViewModel { var SpenderGroups: [SpenderGroup]? var isFetching: Bool = true private let networkManager = NetworkManager.shared init() { Task { await fetchGroups() } } func fetchGroups() async { Guard !(networkManager.autCreds.auth_token ?? “”).isEmpty else { print( “認証トークンが空です”) self.isFetching = false return } self.isFetching = true // ここに非同期ロード データ ロジックがいくつかあります。 // 関数は API からすべてのユーザー グループのリストを取得します。 // 成功した場合、マークの取得が false になります。 { self.isFetching = false print(“グループの取得が完了しました” ) } } func fetchGroup(spenderGroup: SpenderGroup) async { ガード !(networkManager.autCreds.auth_token ?? “”).isEmpty else { print(“認証トークンが空です”) self.isFetching = false return } self.isFetching = true // ここに非同期ロード データ ロジックをいくつか示します // 関数は API から 1 つのグループに関する詳細情報を取得します / / ここで、成功した場合はマークの取得が false になります { self.isFetching = false print(“グループの取得が完了しました”) } } }

2 つのビュー (1 つはグループ リスト)

struct SpenderGroupsView: View { var viewModelCurrentUser : AuthViewModel @Environment(SpenderGroupsViewModel.self) private var viewModelSpenderGroup @Environment(FriendsViewModel.self) private var viewModelFriends var body: some View { if let user = viewModelCurrentUser.currentUser { NavigationView { //Text(“地獄の世界”) リスト { if let SpenderGroups1 = viewModelSpenderGroup.spenderGroups { if viewModelSpenderGroup.isFetching { ProgressView(“Loading…”) .progressViewStyle(CircularProgressViewStyle()) .frame(maxWidth: .infinity, maxHeight: .infinity) .edgesIgnoringSafeArea(.all) } else { ForEach (Array(spenderGroups1.enumerated()) ,id:.offset) {(index, item) in NavigationLink(destination: SpenderGroupDetailView( SpenderGroup: item) .environment(viewModelSpenderGroup) .environment(viewModelFriends) ) { SpenderGroupRowView(spenderGroup: item) .navigationBarBackButtonHidden(true) }}} }} .ツールバー{ NavigationLink(destination: SpenderGroupCreateView(viewModelSpenderGroup: viewModelSpenderGroup) .environment(viewModelFriends) ) { Image(“add-group”) } } .navigationTitle(“Groups”) .navigationBarTitleDisplayMode(.inline) .onAppear() { Task { await viewModelSpenderGroup. fetchGroups() } print(“onAppear”) } .onDisamper() { } }}}}}

もう 1 つは詳細ビューです

struct SpenderGroupDetailView: View { @Environment(.dismiss) var dismiss @Environment(SpenderGroupsViewModel.self) private var viewModelSpenderGroup @Environment(FriendsViewModel.self) private var viewModelFriends let SpenderGroup : SpenderGroup var body: some View { let groupName = SpenderGroup.groupName .大文字の場合viewModelSpenderGroup.isFetching { ProgressView(“Loading…”) .progressViewStyle(CircularProgressViewStyle()) .frame(maxWidth: .infinity, maxHeight: .infinity) .edgesIgnoringSafeArea(.all) } else { List { Section (header: Text() “経費”) ) { NavigationLink(destination: ExpensesView(viewModelSpenderGroup: viewModelSpenderGroup、spenderGroup: SpenderGroup)) { HStack(alignment: .center ) { Text(spenderGroup.groupName.prefix(1).uppercased() ) .fontWeight(.bold) .font(.headline) .foregroundColor(.white) 。フレーム(幅: 35、高さ: 35) .background(Color(.systemCyan)) .clipShape(/*@START_MENU_TOKEN@*/Circle()/*@END_MENU_TOKEN@*/) VStack (配置: .leading、間隔: 6) { Text(groupName.capitalized) .font(.subheadline) Text(“Something” ) .font(.caption) .foregroundStyle(.gray) } Spacer() VStack (配置: .trailing, spacing: 6) { Text(“Total”) .font(.subheadline) .frame(alignment: .trailing) Text(String(format:”%.2f”,spenderGroup.totalAmount ?? 0)) .font(.subheadline) .frame(alignment: .trailing) } } } } Section (header: Text(“Spenders”) ){ HStack(alignment: .center){ Spacer() let Spenders = SpenderGroup.spenders ?? []
NavigationLink(destination: SpenderGroupAddSpenders(selections: Spenders, SpenderGroup: SpenderGroup ) .environment(viewModelFriends) .environment(viewModelSpenderGroup) ) { VStack(alignment: .trailing){ Image(systemName: “plus”) }} } if viewModelSpenderGroup.isFetching {テキスト(“読み込み中”) } else { HStack(alignment: .center){ VStack (spacing: 12) { if let Spenders = SpenderGroup.spenders { ForEach(Array(spenders.sorted(by: {$0.fullname)

詳細ビューでデータを更新しようとすると、インターフェイスが SpenderGroupsView に戻り、おそらく 10 回以上グループ機能が開始されます。フォーム間でデータを送信し、ビュー間で切り替わらないようにする正しい方法は何ですか?初めてデータをロードし、このデータのロード中に進行状況ビューを表示する最良の方法は何ですか?

ビューが画面の上部にあるときは正しく更新されることを期待していますが、それ以外の方法はありません

#ios #データ更新のサイクル化

執筆者について: nipponese

Nipponese News編集部は、国内外のニュースを日本語で分かりやすくお届けします。