问题描述
我是swift的初学者,我在解析json数据时有一个线程,对象结果为nil,谁能帮我找出问题所在。如果func返回void,我可以获得正确的数据,但我不能将它作为数组返回。谢谢
struct catalogobject: Hashable,Decodable,encodable{
let objects: [Catalogobject]?
}
func getCatalog() -> [Catalogobject] {
var object : [Catalogobject]!
let url = URL(string: "https://connect.squareupsandBox.com/v2/catalog/list")!
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.addValue("Bearer \(token)",forHTTPHeaderField: "Authorization")
request.addValue("\(content_type)",forHTTPHeaderField: "Content-Type")
request.addValue("\(square_version)",forHTTPHeaderField: "Square-Version")
URLSession.shared.dataTask(with: request) { data,res,error in
let data = data!
do {
let catalogdata = try JSONDecoder().decode(catalogobject.self,from: data)
object = catalogdata.objects
print("object \(object)")
}catch{
print(error)
}
}.resume()
return object
}
解决方法
网络请求是一个异步任务,您应该使用完成块返回数据,而不是通过这种方式返回对象。 在您的代码中,函数体在网络调用完成其任务之前执行并返回。
关于您应该如何做的示例指南:
func getCatalog(_ completion: @escaping ([CatalogObject]) -> ()) {
let url = URL(string: "https://connect.squareupsandbox.com/v2/catalog/list")!
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.addValue("Bearer \(token)",forHTTPHeaderField: "Authorization")
request.addValue("\(content_type)",forHTTPHeaderField: "Content-Type")
request.addValue("\(square_version)",forHTTPHeaderField: "Square-Version")
URLSession.shared.dataTask(with: request) { data,res,error in
let data = data!
do {
let catalogdata = try JSONDecoder().decode(catalogobject.self,from: data)
completion(catalogdata.objects)
print("object \(object)")
}catch{
print(error)
}
}.resume()
}