从完成处理程序中指定单个值

时间:2016-12-12 22:32:20

标签: ios swift

我正在学习目前的完成处理程序,我正在尝试了解如何从函数外部获取值以在应用程序的其他地方使用。这是我的班级:

cell.textLabel?.text = companies[0].stockPrice

我正在尝试将个别股票价格分配给companyList中的相应公司,以便稍后我可以使用这些值

    stockFetcher(completion: {
        (stockPrices) -> Void in
        print(stockPrices!)
    })

对于苹果的股票价格等

React.cloneElement

^打印所有stockPrices。我是否需要为每家公司调用单独的完成处理程序?或者有更简单的方法吗?

2 个答案:

答案 0 :(得分:0)

如果您想立即获得所有股票价格,请让您的完成处理程序返回每个公司的价格数组。然后,您可以使用检索到的价格初始化Company对象。

理想情况,API会返回包含价格和任何其他数据的公司名称。您可以从API获取数据(可能是JSON格式),然后使用for循环从中获取所有Company对象。但是,似乎api没有这样做?如果我错了,请纠正我。

以下是修改函数以返回数组的方法......

func stockFetcher(completion: @escaping ([String]?) -> Void) {
    Alamofire.request(stockUrl).responseJSON { (responseData) -> Void in
        var prices = [String]()
        if((responseData.result.value) != nil) {
            let json = JSON(responseData.result.value!)
            if let microsoftStockPrice = json["query"]["results"]["quote"][5]["Ask"].string {
                 prices.append(microsoftStockPrice)
            }
            if let appleStockPrice = json["query"]["results"]["quote"]["6"]["Ask"].string {
                 prices.append(appleStockPrice)
            }
            completion(prices)
        }
    }
}

答案 1 :(得分:0)

为什么不尝试这样的事情?

func stockFetcher(completion: @escaping (data [String]) -> Void) {

Alamofire.request(stockUrl).responseJSON { (responseData) -> Void in

if((responseData.result.value) != nil) {

    var stocks: [String] = []
    for stockJson in JSON(responseData.result.value!).array {
        stock.append(//get your data for every stock)
    }
    completion(microsoftStockPrice)
    } 
}

这种方式只需要一个库存数组或您需要的其他数据就可以调用完成块。这是你想要做的吗?