我正在Xcode的XCTest框架内发出http发布请求,以针对我的应用进行简单的UI测试。在请求内,返回响应。我无法在URLSession任务之外访问该响应,我需要这样做,因为它包含一个JWT,必须将其解码并用于另一个http发布请求。
我已经尝试研究如何执行此操作,但是由于我是Swift的初学者,因此很难知道正确的方法。我尝试创建一个新的json对象,并将该响应分配给URLSession之外,但它只是说它找不到该响应,它不在范围内。
// make HTTP request
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
print(error?.localizedDescription ?? "No data")
return
}
let responseJSON = try? JSONSerialization.jsonObject(with: data, options: [])
if let responseJSON = responseJSON as? [String: Any] {
print(responseJSON)
}
}
task.resume()
let response = responseJSON as! [String:Any]
预期结果是我现在将响应对象放在http请求之外,然后可以对其进行解码。实际结果是错误:
使用未解析的标识符'responseJSON'
答案 0 :(得分:0)
您提出的请求是异步的。所以当你跑线...
let response = responseJSON as! [String:Any]
网络请求尚未完成。因此,您通常会使用在网络返回
时将调用的完成处理程序这是一个示例游乐场:
//: Playground - noun: a place where people can play
import PlaygroundSupport
import UIKit
PlaygroundPage.current.needsIndefiniteExecution = true
func postSomeData(completion: @escaping ([String: Any]?, Error?) -> Void) {
// setup request
let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1")
let request = URLRequest(url: url!)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
print(error?.localizedDescription ?? "No data")
completion(nil, error)
}
let responseJSON = try? JSONSerialization.jsonObject(with: data, options: [])
if let responseJSON = responseJSON as? [String: Any] {
completion(responseJSON, nil)
}
}
task.resume()
}
postSomeData() { response, error in
print(response, error)
PlaygroundPage.current.finishExecution()
}
输出:
Optional([[“ id”:1,“ title”:delectus autem,“ completed”:0,“ userId”:1])无
我还建议您使用Codable
来解析和映射JSON响应。 Here is an intro可以使用Codable,但是有关该主题的在线资源很多。