I have written this code:
func getjson() { let urlPath = "https://api.whitehouse.gov/v1/petitions.json?limit=100" let url = NSURL(string: urlPath) let session = NSURLSession.sharedSession() let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in print("Task completed") if(error != nil) { print(error!.localizedDescription) } let err: NSError? if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary { if(err != nil) { print("JSON Error \(err!.localizedDescription)") } if let results: NSArray = jsonResult["results"] as? NSArray { dispatch_async(dispatch_get_main_queue(), { self.tableData = results self.Indextableview.reloadData() }) } } }) task.resume() }
And after update to XCode 7 it gives me this error: Invalid conversion from throwing function of type (_, _, _) throws -> Void to non-throwing function type (NSData?, NSURLResponse?, NSError?) -> Void. It is in line, where is let task.
Thanks
You need to implement Do Try Catch error handling as follow:
import UIKit import PlaygroundSupport PlaygroundPage.current.needsIndefiniteExecution = true extension URL { func asyncDownload(completion: @escaping (_ data: Data?, _ response: URLResponse?, _ error: Error?) -> ()) { URLSession.shared .dataTask(with: self, completionHandler: completion) .resume() } }
let jsonURL = URL(string: "https://api.whitehouse.gov/v1/petitions.json?limit=100")! let start = Date() jsonURL.asyncDownload { data, response, error in print("Download ended:", Date().description(with: .current)) print("Elapsed Time:", Date().timeIntervalSince(start), terminator: " seconds\n") print("Data size:", data?.count ?? "nil", terminator: " bytes\n\n") guard let data = data else { print("URLSession dataTask error:", error ?? "nil") return } do { let jsonObject = try JSONSerialization.jsonObject(with: data) if let dictionary = jsonObject as? [String: Any], let results = dictionary["results"] as? [[String: Any]] { DispatchQueue.main.async { results.forEach { print($0["body"] ?? "", terminator: "\n\n") } // self.tableData = results // self.Indextableview.reloadData() } } } catch { print("JSONSerialization error:", error) } } print("\nDownload started:", start.description(with: .current))
As Leo suggested, your problem is that you're using try
, but not within the do
-try
-catch
construct, which means that it infers that the closure is defined to throwing the error, but since it is not defined as such, you get that error.
So, add do
-try
-catch
:
func getjson() { let urlPath = "https://api.whitehouse.gov/v1/petitions.json?limit=100" let url = URL(string: urlPath)! let session = URLSession.shared let task = session.dataTask(with: url) { data, response, error in print("Task completed") guard let data = data, error == nil else { print(error?.localizedDescription) return } do { if let jsonResult = try JSONSerialization.jsonObject(with: data) as? [String: Any] { if let results = jsonResult["results"] as? [Any] { DispatchQueue.main.async { self.tableData = results self.indexTableView.reloadData() } } } } catch let parseError { print("JSON Error \(parseError.localizedDescription)") } } task.resume() }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With