如何从URLSession中获取价值



我不断地回到同样的问题上。对于我的应用程序的其他部分,我在解析API后直接使用了coredata,这很好。然而,现在我想解析通过API接收的JSON,并只获取一个值,用于计算其他值,然后将其放入Coredata。

一切都很好,我已经设置URLSessions代码如下:

func fetchData(brand: String, completion: @escaping ((Double) -> Void)) {
let urlString = "(quoteUrl)(brand)"
if let url = URL(string: urlString) {
var session = URLRequest(url: url)
session.addValue("application/json", forHTTPHeaderField: "Accept")
session.addValue("Bearer (key)", forHTTPHeaderField: "Authorization")
let task = URLSession.shared.dataTask(with: session) { (data, response, error) in
if error != nil {
print(error!)
return
}
if let safeData = data  {
let decoder = JSONDecoder()
do {
let decodedData = try decoder.decode(DataModel.self, from: safeData)
let bid = decodedData.quotes.quote.bid
let ask = decodedData.quotes.quote.ask
let itemPrice: Double = (bid + ask)/2
completion(itemPrice)
} catch {
print(error)
}
}
}
task.resume()
} 
}

我正在使用completionHandler来检索我需要的部分,我在另一个文件中使用它,如下所示:

func getGainLossNumber(brand: String, quantity: Int, price: Double) -> Double {
var finalPrice = 0.0
APImodel.fetchData(brand: brand) { returnedDouble in
let currentPrice = returnedDouble
if quantity < 0 {
let orderQuantity = quantity * -1
finalPrice = price + (currentPrice*(Double(orderQuantity))*100)
} else {
finalPrice = price - (currentPrice*(Double(quantity))*100)
}

}
return finalPrice
}

finalPrice最终返回0.0。如果我在闭包中打印currentPrice,我确实得到了正确的结果。由于我面临的问题,我使用了完成处理程序来从API中检索一个数字,但它仍然没有做我想要做的事情。第二个函数应该返回使用我从API获得的值计算的值,该值是用完成处理程序检索的。

我就是不知道怎么做。

问题是在闭包中计算finalPrice,它是异步的。然而,您的getGainLossNumber方法是同步的,因此它实际上在您的闭包完成计算finalPrice之前返回。重新构造代码,使getGainLossNumber将闭包作为参数,并在计算出finalPrice后调用它。类似于:

func getGainLossNumber(brand: String, quantity: Int, price: Double, _ completion: @escaping (Double) -> Void) {
APImodel.fetchData(brand: brand) { returnedDouble in
let currentPrice = returnedDouble
let finalPrice: Double
if quantity < 0 {
let orderQuantity = quantity * -1
finalPrice = price + (currentPrice*(Double(orderQuantity))*100)
}
else {
finalPrice = price - (currentPrice*(Double(quantity))*100)
}

completion(finalPrice)
}
}

还要注意,finalPrice不需要是var,因为它只会被分配一次值。

编辑

用法:

getGainLossNumber(brand: "brand", quantity: 1, price: 120, { finalPrice in
// You can access/use finalPrice in here.
}

相关内容

  • 没有找到相关文章

最新更新