首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在后台运行JSON请求Swift 4

在后台运行JSON请求Swift 4
EN

Stack Overflow用户
提问于 2018-04-27 01:47:44
回答 1查看 2.1K关注 0票数 1

如果可能的话,我需要在后台运行这些代码。我得到一个JSON请求,有时加载需要一段时间(延迟在URL的服务器端,而不是代码本身)。

如果可能的话,我想在后台运行下面的代码。有什么想法吗?

代码语言:javascript
复制
        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,但没有运气。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-27 02:34:08

延迟是由Data(contentsOf:)是一个同步方法造成的。正如文献资料所说,

重要 不要使用这种同步方法请求基于网络的URL。对于基于网络的URL,这种方法可以在一个缓慢的网络上阻塞当前线程几十秒,导致用户体验差,在iOS中,可能会导致应用程序被终止。相反,对于非文件URL,请考虑使用URLSession类的URLSession(with:completionHandler:)方法。有关示例,请参见将网站数据输入内存

正如您通过实验发现的,将此方法放置在DispatchQueue.main.async中并不会使其成为异步方法。相反,请遵循文档的指示。

这是在将网站数据输入内存中找到的稍微修改过的示例

代码语言:javascript
复制
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()
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50054074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档