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)
}
我无法找出为什么我的 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)
}