函数与dataTask返回一个值

时间:2016-10-13 07:29:07

标签: swift nsurlrequest

我不想检查我的url statusCode是否等于200,如果statusCode等于200,我创建了一个返回布尔值的函数,我使用dataTask,但我不知道如何返回值:

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()
}

if else中的返回返回错误:

  

void函数中出现意外的非void返回值

4 个答案:

答案 0 :(得分:7)

为了返回值,你应该使用块。尝试声明你的功能:

row.names(myVAR)
[1] "2010.66666666667" "2010.75"          "2010.83333333333" "2010.91666666667"
............................................................
[61] "2015.66666666667" "2015.75"          "2015.83333333333" "2015.91666666667"

然后像这样称呼它:

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()
}

希望这会有所帮助。

答案 1 :(得分:5)

如果您想保留原始的返回模式,请考虑semaphore

func checkUrl(urlString: String) -> Bool {
    if let url = URL(string: fileUrl) {
        var result: Bool!

        let semaphore = DispatchSemaphore(value: 0)  //1. create a counting semaphore

        let session = URLSession.shared
        session.dataTask(with: url, completionHandler: { (data, response, error) in
            result = true  //or false in case
            semaphore.signal()  //3. count it up
        }).resume()

        semaphore.wait()  //2. wait for finished counting

        return result
    }

    return false
}

答案 2 :(得分:0)

您从[{1}}关闭Void关闭的completionHandler函数返回一个值

关于你的代码,有一些错误:你不能返回该值,因为它在不同的线程上执行,它是一个异步操作。请看一下这个主题:Returning data from async call in Swift function

答案 3 :(得分:0)

Swift4,就我而言 尝试在guard let data = data else { return }中添加dataTask,例如:

URLSession.shared.dataTask(with: request) { (data, response, error) in
    guard let data = data else { return }
    print("get some data")
}.resume()