2016-10-13 2 views
3

Я не проверял, равен ли мой статус statusCode 200, я создал функцию, возвращающую логическое значение, если statusCode равен 200, я использую dataTask, но я не знаю как вернуть значение:Функция с 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 возвращается ошибка:

Unexpected non-void return value in void function

ответ

5

, чтобы вернуть значение, вы должны использовать блоки. Попробуйте объявить вашу функцию как это:

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

А потом называют это так:

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

Надеется, что это поможет.

0

Вы возвращаете значение из Void функции, которая является completionHandler закрытием dataTask(_:, _:)

-

Что касается вашего кода, есть что-то не так: вы не можете вернуть это значение, потому что оно выполняется в другом потоке, это асинхронная операция. Пожалуйста, взгляните на эту тему: Returning data from async call in Swift function

1

Рассмотрите 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 
} 
Смежные вопросы