获取 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。