微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI 和 Apollo IOS 架构问题

如何解决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 举报,一经查实,本站将立刻删除。