这里有一个更深层的问题,你试图从异步运行的方法返回数据。你应该改变你的方法不返回任何东西本身,而是提供一个完成处理程序,通过它可以异步地传回相关数据:
class func downloadJSONFile(completionHandler:(AnyObject?) ->()) {
let requestURL: NSURL = NSURL(string: "http://www.learnswiftonline.com/Samples/subway.json")!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(urlRequest) { data, response, error in
// check for fundamental networking errors
guard error == nil && data != nil else {
print(error)
completionHandler(nil)
return
}
// check to see if status code found, and if so, that it's 200
guard let httpResponse = response as? NSHTTPURLResponse where httpResponse.statusCode == 200 else {
completionHandler(nil)
return
}
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options:[])
completionHandler(json)
} catch let parseError as NSError {
print("Error with Json: \(parseError)")
completionHandler(nil)
}
}
task.resume()
}
,然后你怎么称呼它,使用完成处理程序(或使用尾随的闭包语法,像图所示):
APIClass.downloadJSONFile() { json in
guard json != nil else {
print("there was some problem")
return
}
// now you can use `json` here
dispatch_async(dispatch_get_main_queue()) {
// and if you're doing any model or UI updates, dispatch that back to the main queue
}
}
// but do not use `json` here, as the above runs asynchronously
注意,如果你想提供错误信息返回给调用程序,你可以改变它也返回错误信息,例如:
enum DownloadError : ErrorType {
case NetworkError(NSError?)
case NotHTTPResponse
case InvalidHTTPResponse(Int)
case JSONError(NSError)
}
class func downloadJSONFile(completionHandler:(AnyObject?, ErrorType?) ->()) {
let requestURL: NSURL = NSURL(string: "http://www.learnswiftonline.com/Samples/subway.json")!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(urlRequest) { data, response, error in
guard error == nil && data != nil else {
completionHandler(nil, DownloadError.NetworkError(error))
return
}
guard let httpResponse = response as? NSHTTPURLResponse else {
completionHandler(nil, DownloadError.NotHTTPResponse)
return
}
guard httpResponse.statusCode == 200 else {
completionHandler(nil, DownloadError.InvalidHTTPResponse(httpResponse.statusCode))
return
}
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options:[])
completionHandler(json, nil)
} catch let parseError as NSError {
completionHandler(nil, DownloadError.JSONError(parseError))
}
}
task.resume()
}
而且,很明显,通话将改变拿两个参数:
APIClass.downloadJSONFile() { json, error in
guard json != nil && error == nil else {
print("there was some problem \(error)")
return
}
// and then it would be like before ...
}
你不*从异步调用的返回*。示例:http://stackoverflow.com/a/35358750/2227743另外,您不应强制转换响应,它可能不在此处,因此请首先检查错误参数。 – Moritz