6. 将查询连接到您的 UI
在本章中,您将展示一个启动项列表列表.
配置 LaunchListViewModel
在LaunchListViewModel
添加一个新的变量,用于存放查询返回的启动项:
LaunchListViewModel.swift
@Published var launches = [LaunchListQuery.Data.Launches.Launch]()@Published var appAlert: AppAlert?@Published var notificationMessage: String?
接下来,将TODO
方法中的loadMoreLaunches()
替换为运行LaunchListQuery
的代码:
LaunchListViewModel.swift
Network.shared.apollo.fetch(query: LaunchListQuery()) { [weak self] result inguard let self = self else {return}switch result {case .success(let graphQLResult):if let launchConnection = graphQLResult.data?.launches {self.launches.append(contentsOf: launchConnection.launches.compactMap({ $0 }))}if let errors = graphQLResult.errors {self.appAlert = .errors(errors: errors)}case .failure(let error):self.appAlert = .errors(errors: [error])}}
GraphQLResult
包含data
和errors
属性。这是因为在GraphQL中,如果数据非空,允许返回部分数据。
在现在的例子中,理论上我们可以得到launches的列表,然后得到一个错误,表示无法检索具有特定ID的launch。
这就是为什么当您得到GraphQLResult
时,通常会检查data
属性(以显示您从服务器获得的结果)和错误属性(以尝试处理您从服务器收到的任何错误)。
如代码所示,示例项目已经通过将所需的值分配给appAlert
属性,提供了一个显示错误警报的简单方法。
在界面中使用 Launches
首先,让我们更新我们的LaunchRow
视图,使其能够显示特定Launch
的数据。在文件顶部添加import RocketReserverAPI
,然后添加以下variable:
LaunchRow.swift
let launch: LaunchListQuery.Data.Launches.Launchprivate let placeholderImg = Image("placeholder")
然后,让我们更新我们的一个Text视图,以显示launch的位置:
LaunchRow.swift
VStack(alignment: .leading) {Text("Mission Name")Text(launch.site ?? "Launch Site").font(.system(size: 14))}
更新LaunchRow
后,让我们转到LaunchListView
并开始显示我们的Launches列表。
更新ForEach
循环,使其遍历viewModel
中的每个launch项目,并为其创建一个LaunchRow
:
LaunchListView.swift
ForEach(0..<viewModel.launches.count, id: \.self) { index inLaunchRow(launch: viewModel.launches[index])}
最后一步是调用我们之前更新的loadMoreLaunches
方法,实际上query服务器上的数据。为此,请将TODO
更新为以下内容:
LaunchListView.swift
.task {viewModel.loadMoreLaunches()}
测试您的查询
构建并运行应用程序,您现在可以将UI连接到您的GraphQL查询 🚀。
接下来,您将 给列表添加更多信息 以使它看起来更美观!