function with dataTask returning a value

前端 未结 4 1209
深忆病人
深忆病人 2020-12-06 14:26

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

相关标签:
4条回答
  • 2020-12-06 14:40

    Swift4, work in my case Try to add guard let data = data else { return } in dataTask like:

    URLSession.shared.dataTask(with: request) { (data, response, error) in
        guard let data = data else { return }
        print("get some data")
    }.resume()
    
    0 讨论(0)
  • 2020-12-06 14:41

    You're returning a value from a Void function that is the completionHandler closure of dataTask(_:, _:)

    Regarding your code, there is something wrong: you can't return that value because it's executed on a different thread, it's an asynchronous operation. Please take a look at this thread: Returning data from async call in Swift function

    0 讨论(0)
  • 2020-12-06 14:46

    Consider semaphore if you want to keep your original return pattern.

    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
    }
    
    0 讨论(0)
  • 2020-12-06 14:49

    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.

    0 讨论(0)
提交回复
热议问题