JSON 网络请求未进入 URLSession.shared.dataTask

JSON networking request not entering URLSession.shared.dataTask

我无法找出为什么我的 dataTask returns 结果为空。 通过 My NetworkingManager class 时,它似乎从未进入 URLSession.shared.dataTask。有谁知道为什么?

她是我的 NetworkingManager,正在应用的 ContentView 中使用:

class NetworkingManager: ObservableObject {
    var didChange = PassthroughSubject<NetworkingManager, Never>()
    
    var showList = ShowResultsAPI(results: []) {
        didSet {
            didChange.send(self)
        }
    }
    
    init() {
        guard let url = URL(string:  "www.json.url") else {
            return }
        URLSession.shared.dataTask(with: url) { (data, _, _) in
            guard let data = data else {
                return }
            
            let showList = try! JSONDecoder().decode(ShowResultsAPI.self, from: data)

            DispatchQueue.main.async {
                self.showList = showList
            }

        }.resume()
    }
}

我认为您的编码看起来是正确的。 请记住,该请求是异步的。当您调试 URLSession.shared.dataTask 时,您会发现调试器最初跳过了 dataTask。当 URLSession 收到响应时,它将再次输入 URLSession.shared.dataTask。 我建议在你的 guard 声明行中设置一个断点。然后再调试进程,看调试器是否进入进程。

观察完成处理程序中的响应和错误以查看是否发生错误也很有趣。

     URLSession.shared.dataTask(with: url) { (data, response, error) in
       if let error = error {
            print(error)
            return
        }
        guard let httpResponse = response as? HTTPURLResponse,
                    httpResponse.statusCode == 200,
                    let data = data
                    else {
                        print("ResponseProblem")
                        print(response)
                        return
                }

在 init() 的末尾添加 .sleep(2) 有助于处理 JSON。

已编辑:

它需要一个异步任务,这意味着有一个睡眠或@vadian 建议更适合 combine 的 delay()。

在 guard 中添加 return 值:return“示例”

将您的代码更改为:

  }

    }.resume()
     sleep(2)
}