0

我目前正在使用 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
            }
        }
    }
...
}
4

0 回答 0