SwiftUI 和 Apollo IOS 架构问题

问题描述

我目前正在使用 Apollo Graphql 客户端构建 SwiftUI 应用程序。我可以将 Items(Agents) 列表加载到视图中并使用 NavigationLink 在详细视图中查看列表项。我什至可以打开一个工作表来创建一个新的 Agent 或编辑一个 Agent,我只需将新的或编辑过的项目添加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
            }
        }
    }
...
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)