如您所见,我正在接收一个JSON文件,使用SwiftyJSON对其进行解析,并尝试返回totalTime,但是它不允许我这样做。我该怎么做呢?
func googleDuration(origin: String, destination: String) -> Int{ // do calculations origin and destiantion with google distance matrix api let originFix = origin.stringByReplacingOccurrencesOfString(" ", withString: "+", options: NSStringCompareOptions.LiteralSearch, range: nil); let destinationFix = destination.stringByReplacingOccurrencesOfString(" ", withString: "+", options: NSStringCompareOptions.LiteralSearch, range: nil); let urlAsString = "https://maps.googleapis.com/maps/api/distancematrix/json?origins="+originFix+"&destinations="+destinationFix; println(urlAsString); let url = NSURL(string: urlAsString)! let urlSession = NSURLSession.sharedSession() let task = urlSession.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in if error != nil { // If there is an error in the web request, print it to the console println(error.localizedDescription) } println("parsing JSON"); let json = JSON(data: data); if (json["status"].stringValue == "OK") { if let totalTime = json["rows"][0]["elements"][0]["duration"]["value"].integerValue { println(totalTime); } } }) task.resume(); }
您应该添加自己的completionHandler闭包参数,并在任务完成时调用它:
completionHandler
func googleDuration(origin: String, destination: String, completionHandler: (Int?, NSError?) -> Void ) -> NSURLSessionTask { // do calculations origin and destiantion with google distance matrix api let originFix = origin.stringByReplacingOccurrencesOfString(" ", withString: "+", options: NSStringCompareOptions.LiteralSearch, range: nil); let destinationFix = destination.stringByReplacingOccurrencesOfString(" ", withString: "+", options: NSStringCompareOptions.LiteralSearch, range: nil); let urlAsString = "https://maps.googleapis.com/maps/api/distancematrix/json?origins="+originFix+"&destinations="+destinationFix println(urlAsString) let url = NSURL(string: urlAsString)! let urlSession = NSURLSession.sharedSession() let task = urlSession.dataTaskWithURL(url) { data, response, error -> Void in if error != nil { // If there is an error in the web request, print it to the console // println(error.localizedDescription) completionHandler(nil, error) return } //println("parsing JSON"); let json = JSON(data: data) if (json["status"].stringValue == "OK") { if let totalTime = json["rows"][0]["elements"][0]["duration"]["value"].integerValue { // println(totalTime); completionHandler(totalTime, nil) return } let totalTimeError = NSError(domain: kAppDomain, code: kTotalTimeError, userInfo: nil) // populate this any way you prefer completionHandler(nil, totalTimeError) } let jsonError = NSError(domain: kAppDomain, code: kJsonError, userInfo: nil) // again, populate this as you prefer completionHandler(nil, jsonError) } task.resume() return task }
NSURLSessionTask如果调用者希望能够取消任务,我也将获得此返回。
NSURLSessionTask
无论如何,您可以这样称呼它:
googleDuration(origin, destination: destination) { totalTime, error in if let totalTime = totalTime { // use totalTime here } else { // handle error } }