我在查找dataTask返回空结果的原因时遇到问题。在浏览My NetworkingManager类时,它似乎从未进入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
}
在guard:return中添加返回值"示例";
将您的代码更改为:
}
}.resume()
sleep(2)
}
在init((的末尾添加.sleep(2(有助于处理JSON。
编辑:
它需要一个异步任务,这意味着要有一个睡眠,或者正如@vadian建议的那样,从combine中选择一个更合适的delay((。