swiftnsurlrequest

function with dataTask returning a value


I wan't to check if my url statusCode equals to 200, I created a function returning a Boolean if the statusCode equals to 200, I'm using a dataTask, but I don't know how to return a value:

class func checkUrl(urlString: String) -> Bool{

    let urlPath: String = urlString
    var url: NSURL = NSURL(string: urlPath)!
    var request: NSURLRequest = NSURLRequest(url: url as URL)
    var response: URLResponse?

    let session = Foundation.URLSession.shared


    var task = session.dataTask(with: request as URLRequest, completionHandler: {(data, response, error) in
        if let error = error {
            print(error)
        }

        if let data = data{
            print("data =\(data)")
        }
        if let response = response {
            print("url = \(response.url!)")
            print("response = \(response)")
            let httpResponse = response as! HTTPURLResponse
            print("response code = \(httpResponse.statusCode)")

            if httpResponse.statusCode == 200{
                return true
            } else {
                return false
            }
        }
    })
    task.resume()
}

The returns in if else are returning an error:

Unexpected non-void return value in void function


Solution

  • in order to return value you should use blocks. Try declaring your function like this:

    class func checkUrl(urlString: String, finished: ((isSuccess: Bool)->Void) {
    
        let urlPath: String = urlString
        var url: NSURL = NSURL(string: urlPath)!
        var request: NSURLRequest = NSURLRequest(url: url as URL)
        var response: URLResponse?
    
        let session = Foundation.URLSession.shared
    
    
        var task = session.dataTask(with: request as URLRequest, completionHandler: {(data, response, error) in
            if let error = error {
                print(error)
            }
    
            if let data = data{
                print("data =\(data)")
            }
            if let response = response {
                print("url = \(response.url!)")
                print("response = \(response)")
                let httpResponse = response as! HTTPURLResponse
                print("response code = \(httpResponse.statusCode)")
    
                if httpResponse.statusCode == 200{
                    finished(isSuccess: true)                
                } else {
                    finished(isSuccess: false) 
                }
            }
        })
        task.resume()
    }
    

    And then call it like this:

    checkUrl("http://myBestURL.com", finished { isSuccess in
    // Handle logic after return here
    })
    

    Hope that this will help.