首页 > 解决方案 > 如何在加载 viewController 之前等到 API 完成获取请求和附加变量

问题描述

我有一些助手对 API 执行 Alamofire getRequest,然后填充一些我需要的数组,以便下一个 ViewController 显示正确的信息。我在这里调用 appDelegate 中的请求:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    CGCoins.shared.getData { (arr) in

    }

    CGExchange.shared.getData { (arr) in

    }

    CGPrices.shared.getData { (arr) in

    }

但是它们需要一些时间才能完成,并且在这之前加载 ViewController 会导致崩溃或空标签等。这是帮助程序内部的外观:

import Foundation
import Alamofire
import SwiftyJSON

 class CGCoins {

static let shared = CGCoins()

var ids: [String] = []
var symbols: [String] = []
var names: [String] = []

var coinDictionary: [String : String] = [:]

var defaultCurrency = UserDefaults.standard.string(forKey: "DefaultCurrency")

func getData(completion:@escaping(_ arr:[Type])->()) {
    /// alamofire / urlsession request
    let url = "https://api.coingecko.com/api/v3/coins/list"

    Alamofire.request(url).responseJSON { response in


        switch response.result {
        case .failure(let error):
            // Do whatever here
            return

        case .success(let data):
            // First make sure you got back a dictionary if that's what you expect
            let responseJSON = JSON(response.result.value!)
            if responseJSON.count != 0 {

                //do whatever you want with your object json

                parse(json: responseJSON)
            }
        }

}
/// after finish completion(arr)
func parse(json: JSON) {
    for result in json[].arrayValue {
        let id = result["id"].stringValue
        let symbol = result["symbol"].stringValue
        let name = result["name"].stringValue

        ids.append(id)
        symbols.append(symbol)
        names.append(name)

        for (index, element) in ids.enumerated() {
            coinDictionary[element] = symbols[index]
        }


    }

}


}

}

pageViewController 和 ViewController 使用这些数据。我尝试在启动后创建第二个启动画面并在那里调用获取请求,但是如何让它在获取请求完成之前不推送到 pageViewController?

标签: iosswiftalamofirefoundationurlsession

解决方案


推荐阅读