gpt4 book ai didi

SwiftUI 仅在选项卡 View 中加载一次数据

转载 作者:行者123 更新时间:2023-12-05 06:56:44 40 4
gpt4 key购买 nike

我有一个简单的应用程序,其中包含 TabView 和 4 个不同的选项卡。在我的第二个 View 中,我想进行 API 调用以获取更大类型的数据。

我遇到的问题。为了防止多个后端请求,我的想法是在 onAppear() 生命周期中进行初始调用,而不是将其添加到 ViewModel init() 中,因为这部分在 tabView 的每次更改时都会被调用。

但是,如果我从 onAppear 调用网络请求, View 中的代码不会更新。

如果我从 viewModel init() 调用 mockApiCall。然后更新数据并更新 View 。但是,正如我之前提到的,我不想这样做,因为每次更改选项卡时都会有很多请求


import SwiftUI

class TabsViewModel: ObservableObject {
var shopView: some View {
ViewsBuilder.makeShopView()
}

struct ViewsBuilder {
static func makeShopView() -> some View {
ShopView(viewModel: .init())
}
}
}

//To reproduce go to second tab, view is loaded, go to first tab and then again go to second one
struct TabsView: View {

@ObservedObject
var viewModel: TabsViewModel

@State
private var selection = 1

var body: some View {
TabView(
selection: $selection) {
Text("Tab Content 1")
.tabItem {
if selection == 1 {
Image(systemName: "star.fill")
} else {
Image(systemName: "star")
}
//it works if I set Image(systemName: "star.fill") instead of if statement
}
.tag(1)
viewModel
.shopView
.tabItem {
if selection == 2 {
Image(systemName: "star.fill")
} else {
Image(systemName: "star")
}
//it works if I set Image(systemName: "star.fill") instead of if statement
}
.tag(2)
}
}
}


struct ShopView: View {

@ObservedObject
var viewModel: ShopViewModel

var body: some View {
VStack {
ForEach(viewModel.mockedUser) { user in
Text(user.name)
}
}
.onAppear() {
viewModel.mockApiCall()
}

}
}

class ShopViewModel: ObservableObject {

@Published
var mockedUser: [TestUser] = []

func mockApiCall() {
print("API CALLED")
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
self.mockedUser = [
TestUser(id: 1, name: "Test"),
TestUser(id: 2, name: "User2")
]
}
}

struct TestUser: Identifiable {
let id: Int
let name: String
}
}


最佳答案

找不到有效的解决方案,因此决定继续为 View 模型使用 StateObject 注释

关于SwiftUI 仅在选项卡 View 中加载一次数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65082415/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com