2016-10-13 18 views
3

私のURL statusCodeが200に等しいかどうかをチェックすることはできません。statusCodeが200に等しい場合はBooleanを返す関数を作成しました。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

あなたはdataTask(_:, _:)

0の completionHandler閉鎖され Void関数から値を返すしている値を返す方法

コードに関して、何か間違っています。異なるスレッドで実行されるため、その値を返すことはできません。非同期操作です。このスレッドをご覧ください: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 
}