意外地发现零,同时解开一个可选值返回
问题描述:
我打电话的网址,这将给我的JSON在get()函数。 我从另一个类调用get()函数并尝试以Array格式返回Json的结果。但它显示返回语句中发现null错误。当我试图打印Json的值时,它正确写入。 这是我在swift中的代码。意外地发现零,同时解开一个可选值返回
func get() -> NSArray
{
let postEndpoint: String = "Link_For_JSON_Data"
let session = NSURLSession.sharedSession()
let url = NSURL(string: postEndpoint)!
var jsonArray : NSArray?
var jsonArray1 : NSArray?
session.dataTaskWithURL(url, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
// Make sure we get an OK response
guard let realResponse = response as? NSHTTPURLResponse where
realResponse.statusCode == 200 else
{
print("Not a 200 response")
return
}
// Read the JSON
do
{
if let contentString = NSString(data:data!, encoding: NSUTF8StringEncoding)
{
// Print what we got from the call
jsonArray = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSArray
print("jsonArray here", jsonArray)
// Update the label
dispatch_async(dispatch_get_main_queue())
{() -> Void in
self.getDataFormREST(jsonArray!)
}
}
}
catch
{
print("bad things happened")
}
}).resume()
return jsonArray!
}
func getDataFormREST(resultArray: NSArray) //-> NSArray
{
// let resultDictionary = resultArray[(searchDetails)!-1] as! NSDictionary
testArray = resultArray
print("TESTArray ON ",testArray)
}
答
你不能写一个函数来做一个异步调用,然后返回结果作为函数结果。这不是异步代码的工作方式。你的函数在异步dataTaskWithURL
请求中排队,然后在它甚至有机会发送请求之前返回,更不用说接收结果。
您必须将您的get()
函数重写为无效函数(无返回结果),但需要一个完成块。然后,在您的数据任务的完成处理程序中,您从jsonArray
获取数据并调用get()
函数的完成块,并将其传递给jsonArray
。
看到这个项目我张贴在Github上,说明了什么我谈论:的
+0
我有点困惑。你能展示我怎样才能使用这是我的代码@Duncan C –
可能的复制[下载JSON与NSURLSession不返回任何数据(HTTP://计算器。 com/questions/35289389 /下载 - json-with-nsurlsession-doesnt-return-any-data) – Moritz