我目前正在使用 Apollo Graphql 客户端构建一个 SwiftUI 应用程序。我将项目(代理)列表加载到视图中并使用 NavigationLink 在详细视图中查看列表项没有问题。我什至可以打开一个工作表来创建一个新的代理或编辑一个代理,我只需将新的或编辑的项目添加到 ViewModel 的列表中。
我现在遇到的问题是我已将联系人列表添加到代理项目(在查询下方查看),并且在创建和编辑工作表中,它必须在列表中显示联系人,然后可以从代理中添加、更新和删除正在创建或编辑。如果我向代理添加联系人,我将如何在联系人列表中将其反映为它的 for 循环,它不在 ViewModel 中,也不是 @Published 属性。我尝试了@State var,但遇到了很多循环问题:
=== AttributeGraph: cycle detected through attribute 1379680 ===
...
由于在绘制视图时无法更新 @State var。您将如何设计此场景,您可以在其中添加、编辑和删除代理表中的联系人,而不会导致重绘问题,并且所有其他视图都使用新值更新?
我在模型中尝试了单独的联系人列表,并且发生了类似的 AttributeGraph 错误问题。
query Agents {
agents {
...AgentFragment
}
}
fragment AgentFragment on Agent {
agent_id
user_id
company
description
contacts {
...ContactFragment
}
created_at
}
fragment ContactFragment on AgentContact {
contact_id
agent_id
first_name
last_name
email
phone
mobile
created_at
}
我有一个视图模型类,它从 api 服务器获取数据并在其中存储一组 AgentFragment
class AgentsModel: ObservableObject {
@Published var agents = [AgentFragment]()
@Published var agentEvent: AgentEvent = .None
enum AgentEvent {
case Loading
case Loaded
case None
case Error(title: String, message: String)
}
func loadAgents(cachePolicy: CachePolicy) {
self.agentEvent = .Loading
Network.shared.apollo.fetch(query: AgentsQuery(), cachePolicy: cachePolicy) { result in
switch result {
case .success(let graphQLResult):
if let errors = graphQLResult.errors {
...
} else {
guard let data = try? result.get().data else { return }
do {
let agents = try data.agents.compactMap { try AgentFragment(jsonObject: $0.jsonObject) }
self.addAgents(agents)
} catch {
...HandleError
}
}
self.agentEvent = .Loaded
case .failure(let error):
...HandleError
}
}
}
...
}