获取 API 闭包结果并将其传递给另一个 ViewController
Getting API Result with closure and passing it into an other ViewController
我在我的 viewModel 中得到一个 API 结果,如下所示:
class HomePageViewModel {
var apiResult: CountryDataFromAPI?
//Getting API result via viewModel
public func getAPIResult(withOffset: Int, completion: @escaping () -> Void) {
APIHandler.urlRequest(with: withOffset) { result in
self.apiResult?.data.append(contentsOf: result.data)
print("api resultdata in viewmodel is \(result.data)")
completion()
}
}
}
获得 api 效果很好。在上面的代码中,我可以将语句打印为 print("api resultdata in viewmodel is (result.data)") 并查看预期的 api 结果。
当我如上所述在我的 viewModel 中获取数据时,我在我的 mainViewController 中使用它。
我的 mainViewController 是用 ViewModel 初始化的
class HomePageViewController: UIViewController {
private var viewModel : HomePageViewModel
private var countryDataArray: [CountryData]?
init(with viewModel: HomePageViewModel) {
self.viewModel = viewModel
super.init(nibName: nil, bundle: nil)
}
}
一切正常,直到我尝试从 viewModel 获取数据,如下所示。
我正在尝试将 ViewModel 中的数据设置为名为 countryDataArray 的参数。但是在闭包内执行此操作时,我的打印语句“print(“data in vc is (self?.viewModel.apiResult?.data)”)”打印即使它在 viewModel 中获取数据,也输出 nil。
override func viewDidLoad() {
super.viewDidLoad()
//Getting API Result in viewDidLoad. And after getting the result, reloading the tableView.
self.viewModel.getAPIResult(withOffset: 11) { [weak self] in
DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
self?.countryDataArray = self?.viewModel.apiResult?.data
print("data in vc is \(self?.viewModel.apiResult?.data)")
self?.countriesListTableView.reloadData()
})
}
}
为什么会发生这种情况?
PS:我的api型号如下:
struct CountryDataFromAPI: Codable {
var data: [CountryData]
}
struct CountryData: Codable,Equatable {
let name : String
let code: String
let wikiDataId: String
}
在我看来,问题是 self.apiResult?.data.append(contentsOf: result.data)
您没有为 apiResult.data 分配任何值。因为 apiResult 为 nil。
从 API 获取数据后,您必须初始化 apiResult。
我在我的 viewModel 中得到一个 API 结果,如下所示:
class HomePageViewModel {
var apiResult: CountryDataFromAPI?
//Getting API result via viewModel
public func getAPIResult(withOffset: Int, completion: @escaping () -> Void) {
APIHandler.urlRequest(with: withOffset) { result in
self.apiResult?.data.append(contentsOf: result.data)
print("api resultdata in viewmodel is \(result.data)")
completion()
}
}
}
获得 api 效果很好。在上面的代码中,我可以将语句打印为 print("api resultdata in viewmodel is (result.data)") 并查看预期的 api 结果。
当我如上所述在我的 viewModel 中获取数据时,我在我的 mainViewController 中使用它。
我的 mainViewController 是用 ViewModel 初始化的
class HomePageViewController: UIViewController {
private var viewModel : HomePageViewModel
private var countryDataArray: [CountryData]?
init(with viewModel: HomePageViewModel) {
self.viewModel = viewModel
super.init(nibName: nil, bundle: nil)
}
}
一切正常,直到我尝试从 viewModel 获取数据,如下所示。 我正在尝试将 ViewModel 中的数据设置为名为 countryDataArray 的参数。但是在闭包内执行此操作时,我的打印语句“print(“data in vc is (self?.viewModel.apiResult?.data)”)”打印即使它在 viewModel 中获取数据,也输出 nil。
override func viewDidLoad() {
super.viewDidLoad()
//Getting API Result in viewDidLoad. And after getting the result, reloading the tableView.
self.viewModel.getAPIResult(withOffset: 11) { [weak self] in
DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
self?.countryDataArray = self?.viewModel.apiResult?.data
print("data in vc is \(self?.viewModel.apiResult?.data)")
self?.countriesListTableView.reloadData()
})
}
}
为什么会发生这种情况?
PS:我的api型号如下:
struct CountryDataFromAPI: Codable {
var data: [CountryData]
}
struct CountryData: Codable,Equatable {
let name : String
let code: String
let wikiDataId: String
}
在我看来,问题是 self.apiResult?.data.append(contentsOf: result.data)
您没有为 apiResult.data 分配任何值。因为 apiResult 为 nil。
从 API 获取数据后,您必须初始化 apiResult。