如果可能的话,我需要在后台运行这些代码。我得到一个JSON请求,有时加载需要一段时间(延迟在URL的服务器端,而不是代码本身)。
如果可能的话,我想在后台运行下面的代码。有什么想法吗?
var stockData: Data!
var concatTickersString = ""
for object in dataArray.reversed() {
concatTickersString = concatTickersString + "," + object.symbol
}
let url = URL(string: "https://www.alphavantage.co/query?function=BATCH_STOCK_QUOTES&symbols=" + concatTickersString + "&apikey=IX58FUCXKD695JY0")
do {
stockData = try Data(contentsOf: url!)
let json = try JSON(data: stockData)
if let jsonArray = json["Stock Quotes"].array {
for ticker in jsonArray.reversed() {
if(jsonArray.count != 0){
let stockTicker = ticker["1. symbol"].string!
let stockPrice = ticker["2. price"].string!
self.watchListArray.append(WatchlistData(tickerName: stockTicker, tickerPrice: Double(stockPrice)?.currency))
}
}
tableView.isHidden = false
}
} catch {
print(error)
}它是JSON的服务器,需要很长时间,我认为它不一定是数据(内容)
我试过使用dispatch_async,但没有运气。
发布于 2018-04-27 02:34:08
延迟是由Data(contentsOf:)是一个同步方法造成的。正如文献资料所说,
重要 不要使用这种同步方法请求基于网络的URL。对于基于网络的URL,这种方法可以在一个缓慢的网络上阻塞当前线程几十秒,导致用户体验差,在iOS中,可能会导致应用程序被终止。相反,对于非文件URL,请考虑使用URLSession类的URLSession(with:completionHandler:)方法。有关示例,请参见将网站数据输入内存。
正如您通过实验发现的,将此方法放置在DispatchQueue.main.async中并不会使其成为异步方法。相反,请遵循文档的指示。
这是在将网站数据输入内存中找到的稍微修改过的示例
func startLoad() {
let url = URL(string: "https://www.example.com/")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
self.handleClientError(error)
return
}
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
self.handleServerError(response)
return
}
if let data = data,
let string = String(data: data, encoding: .utf8) {
DispatchQueue.main.async {
doSomething(with: string)
}
}
}
task.resume()
}https://stackoverflow.com/questions/50054074
复制相似问题