Search code examples
iosswifttry-catchurlsessionjson-serialization

Invalid conversion from throwing function of type (_,_,_) throws -> Void to non-throwing function type (NSData?, NSURLResponse?, NSError?) -> Void


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


Solution

  • 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))