2016-08-31 2 views
-1

Я создаю приложение iOS в Swift 3, которое должно связываться с JSON Rest Api, что я также строя себя. Приложение будет получать все виды контента из Api, но пока все, что мне нужно, это проверить доступность Api через функцию рукопожатия.Неожиданное неволевое возвращаемое значение в функции void - JSON Данные из dataTask (с: URL) - (Swift 3.0)

let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 

     if error != nil { 

      print(error) 

     } else { 

      if let urlContent = data { 

       do { 

        let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary 

        if jsonResult["response"] as! String == "Welcome, come in!" { 
         print("************ RESPONSE IS: ************") 
         print(jsonResult) 
         return 

        } else { 
         return 
        } 

       } catch { 

        print("************ JSON SERIALIZATION ERROR ************") 

       } 

      } 

     } 
    } 

    task.resume() 

Это dataTask Я настроил и работает нормально (При печати на JsonResult, я получаю «Добро пожаловать!» Сообщение, как и ожидалось. Проблема заключается в том, что я хочу, чтобы моя функция рукопожатия, чтобы вернуться true или false (чтобы я мог дать предупреждение, если случай является ложным.) Когда я пытаюсь настроить return true или false в if-statement, я получаю сообщение об ошибке: Неожиданное не-void возвращаемое значение в функции void.

Мой вопрос: Как вернуть данные из dataTask, так что я могу выполнить проверку с ней в моей функции рукопожатия я очень новый Swift, так что все помощь оценили :)

? 0

Ниже весь класс:

import Foundation 

class RestApiManager: NSObject { 

var apiAvailability:Bool? 

func handshake() -> Bool { 

    let url = URL(string: "https://api.restaurapp.nl/handshake.php")! 

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 

     if error != nil { 

      print(error) 

     } else { 

      if let urlContent = data { 

       do { 

        let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary 

        if jsonResult["response"] as! String == "Welcome, come in!" { 
         print("************ RESPONSE IS: ************") 
         print(jsonResult) 
         return true 

        } else { 
         return false 
        } 

       } catch { 

        print("************ JSON SERIALIZATION ERROR ************") 

       } 

      } 

     } 
    } 

    task.resume() 


} 

}

+1

Возможный дубликат [Возврат данных из асинхронного вызова в функции Swift] (http://stackoverflow.com/questions/25203556/returning-data-from-async-call-in-swift-function) – vadian

+0

Возможный дубликат [ Как я могу получить данные из NSURLSession.sharedSession() .dataTaskWithRequest] (http://stackoverflow.com/questions/31264172/how-can-i-get-the-data-from-nsurlsession-sharedsession-datataskwithrequest) – Moritz

ответ

0

Поскольку вы используете асинхронный API, вы не можете вернуть логическое значение из вашей handshake функции. Если вы хотите, чтобы показать предупреждение в ложном случае, вы бы заменить return false что-то вроде:

DispatchQueue.main.async { 
    self.showAlert() 
} 

Технически может сделать функцию рукопожатия паузы, пока сеть материал не был сделан, и возвращает логическое значение, но это побеждает цель быть асинхронным, и это заморозит пользовательский интерфейс вашего приложения во время сетевой активности, поэтому я сомневаюсь, что это то, что вы хотите сделать.

Смежные вопросы