SwiftUI嵌套API JSON调用



我正在做一个带有一些数据的小SwiftUI项目,由我自己的本地网络托管。

当视图出现时,我调用返回问题对象数组的QuestionApiCall().getAllQuestions方法。到目前为止一切顺利。在返回数组中的每个问题对象中,都有一个名为senderId的变量。这个变量对于调用另一个方法UserByApiCall(id: senderId).getUserById来获取提出问题的用户的名称是必需的。

我的想法是:

ScrollView(showsIndicators: false) {
VStack {
ForEach(questions) {question in
QuestionView(name: ?, content: question.content, creationTime: question.creation)
}
}
}
.onAppear() {
QuestionApiCall().getAllQuestions { (questions) in
self.questions = questions
}

显示问题正常工作,但我不知道如何显示他们的名字,这只能在调用UserByApiCall(id: senderId).getUserById时显示,每次它循环抛出具有特定senderId的问题数组。

理论上,我需要在每次问题在ForEach-Loop中循环时执行UserByApiCall(id: senderId).getUserById,question.senderId用于获取每个问题的用户对象以显示其名称。

我真的不知道怎么做,也不知道在哪里打电话。我不能只编辑Api和它们的方法,因为这是我实习时的练习。

如果您真的不能更改API,请将调用名称API的责任转移到您的QuestionView

由于你没有包括你的QuestionView,我需要对它做一些假设。

你的name变量应该是这样的:

@State private var name: String = ""

QuestionView.onApear中添加调用名称的函数:

.onApear{
if name == ""{
UserByApiCall(id: senderId).getUserById{[weak self] name in
self?.name = name
}
}
}

最后将VStack改为LazyVStack:

LazyVStack {
ForEach(questions) {question in
QuestionView(name: ?, content: question.content, creationTime: question.creation)
}
}

LazyVstack将确保不是所有的元素都被一次加载。

最新更新