我有一个Swift代码,用于从Web检索和解析JSON数据。一切似乎都很好,除了我现在面临的一个问题。我试图解决它一段时间,在线检查所有来源。
我创建了全局字典“dicOfNeighbours”,希望通过调用“func startConnection”将其作为解析结果返回给其他类。
dicOfNeighbours存储已解析的数据,直到它超出以下的结束括号: “let task = session.dataTaskWithRequest(urlRequest){...}” 在它存储 nil 之后。返回的结果也是零。
我尝试使用 inout 通过引用传递“dicOfNeighbours”变量,但它仍然返回nil结果。
我可能会错过一些解决方案。 我将不胜感激任何帮助和建议。
谢谢!
var dicOfNeighbours = Dictionary<String, [Int]>()
func startConnection() -> Dictionary<String, [Int]>{
let requestURL: NSURL = NSURL(string: "http://www....data.json")!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(urlRequest) {
(data, response, error) -> Void in
let httpResponse = response as! NSHTTPURLResponse
let statusCode = httpResponse.statusCode
if (statusCode == 200) {
do{
let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)
if let neighbours = json["neighbours"] as? [String: Array<Int>] {
var i = 0
for (index, value) in neighbours {
self.dicOfNeighbours[index] = value
}
}
}catch {
print("Error with Json: \(error)")
}
}
}
task.resume()
return self.dicOfNeighbours
}
答案 0 :(得分:2)
您正在使用return
而不是使用回调。在网络连接完成后,您正在进行解析;异步。
要同步它,您需要使用信号量,但在主线程上强烈建议不要这样做。
相反,在执行完成块时,请对结果执行适当的操作。把数据任务想象成“做的事情,当你完成时回到我身边”。