JSON解析-没有URL会话任务恢复的替代方法是啥,因为它不是主线程的一部分?

Posted

技术标签:

【中文标题】JSON解析-没有URL会话任务恢复的替代方法是啥,因为它不是主线程的一部分?【英文标题】:JSON Parsing - What are the alternate ways without URL Session task resume as it is not part of the main thread?JSON解析-没有URL会话任务恢复的替代方法是什么,因为它不是主线程的一部分? 【发布时间】:2018-11-15 11:38:31 【问题描述】:

我是Swift 的新手。对于 JSON 从 API 解析,我找到了以下代码。

guard let url = URL(string: "url path here") else return

let task = URLSession.shared.dataTask(with: url)

    (data, response, error) in
    guard let dataResponse = data,
        error == nil else
    
        print(error?.localizedDescription ?? "Response Error")
        return
    
    do
    
        //json response will be received here
        let jsonResponse = try JSONSerialization.jsonObject(with: dataResponse, options: []) as! [String : Any]
        print(jsonResponse)


    
    catch let parsingError
    
        print("Error", parsingError)
    

task.resume()

为什么我们需要使用task.resume()。没有上述代码,有没有其他方法可以获得JSON 响应。

【问题讨论】:

因为默认不启动任务。这就是为什么你需要做一个resume()。你不喜欢什么? resume 只是 Apple 使用的命名约定。我知道它令人困惑,理想情况下应该开始。但既然苹果喜欢它。没有两种方法:) task.resume() 还恢复暂停的任务,由于任务最初处于暂停状态,我认为 resume 是一个合适的方法名称。 从任何 Web 服务器获取任何数据是一项耗时的任务。主线程不应该做任何需要时间才能完成的任务。相反,您将耗时的任务转移到其他线程,拥有一个通知器(您的任务已完成,如回调)并在主线程中进行最后的接触(如更新 UI)。 【参考方案1】:

为什么我们需要使用task.resume()? -

新初始化的任务以挂起状态开始,因此您需要 调用此方法启动任务。

来源 - https://developer.apple.com/documentation/foundation/urlsessiontask/1411121-resume

有没有其他方法可以在没有上述代码的情况下获取 jsonResponse? -

这是从 api 获取响应的基本代码,即使您使用任何第三方,它们在内部使用相同的 URLSession。

【讨论】:

如果视图出现时需要填充json响应怎么办,因为这里的json响应是在视图出现之后来的 @BernyRayen 如果从 api 收到响应,则必须在响应后刷新/设置视图,在此之前您可以显示获取响应或类似的东西

以上是关于JSON解析-没有URL会话任务恢复的替代方法是啥,因为它不是主线程的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

对于代表返回 void 的操作的任务,Task.FromResult<T>() 的替代方法是啥?

使用会话从 url 获取 Json

url后面带.json和不带的区别是啥

ajax async 已弃用功能的替代方法是啥?

如何使用 jq (或其他替代方法)解析 JSON 字符串?

通过 C# 在 Unity 中从 API URL 解析 JSON