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

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

import UIKit import Alamofire import SwiftyJSON var companyController: CompanyController? let stockUrl = "https://query.yahooapis.com/v1/public/yql?q=select%20symbol%2C%20Ask%2C%20YearHigh%2C%20YearLow%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22AAPL%22%2C%22GOOG%22%2C%22TWTR%22%2C%22TSLA%22%2C%20%22SSNLF%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys" let companies = companyList() class Company: NSObject { var companyName: String var companyLogo: String var stockPrice: String init(companyName:String, companyLogo:String, stockPrice:String) { self.companyName = companyName self.companyLogo = companyLogo self.stockPrice = stockPrice } } func stockFetcher(completion: @escaping (String?) -> Void) { Alamofire.request(stockUrl).responseJSON { (responseData) -> Void in if((responseData.result.value) != nil) { let json = JSON(responseData.result.value!) if let appleStockPrice = json["query"]["results"]["quote"][0]["Ask"].string { completion(appleStockPrice) } if let googleStockPrice = json["query"]["results"]["quote"][1]["Ask"].string { completion(googleStockPrice) } if let twitterStockPrice = json["query"]["results"]["quote"][2]["Ask"].string { completion(twitterStockPrice) } if let teslaStockPrice = json["query"]["results"]["quote"][3]["Ask"].string { completion(teslaStockPrice) } if let samsungStockPrice = json["query"]["results"]["quote"][4]["Ask"].string { completion(samsungStockPrice) } if let microsoftStockPrice = json["query"]["results"]["quote"][5]["Ask"].string { completion(microsoftStockPrice) } print(json) } } } func companyList() -> [Company] { let apple = Company(companyName: "Apple", companyLogo: "AppleLogo", stockPrice: appleStockPrice!) let google = Company(companyName: "Google", companyLogo: "GoogleLogo", stockPrice: googleStockPrice!) let twitter = Company(companyName: "Twitter", companyLogo: "TwitterLogo", stockPrice: twitterStockPrice!) let tesla = Company(companyName: "Tesla", companyLogo: "TeslaLogo", stockPrice: teslaStockPrice!) let samsung = Company(companyName: "Samsung", companyLogo: "SamsungLogo", stockPrice: samsungStockPrice!) let microsoft = Company(companyName: "Microsoft", companyLogo: "MicrosoftLogo", stockPrice: microsoftStockPrice!) return [apple, google, twitter, tesla, samsung, microsoft] } 

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

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

苹果股票价格等

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

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

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

理想情况下 ,一个API将返回公司的名称与价格和任何其他数据。 您可以从API中获取数据(可能采用JSON格式),然后使用for循环来获取所有公司对象。 但是,这似乎并不像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) } } } 

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

 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) } } 

这样完成块将只被调用一次有一个库存数据或你需要的其他数据。 这是你正在尝试做什么?