2016-08-31 3 views
-1

Ich baue eine iOS App in Swift 3, die mit einem JSON Rest Api kommunizieren soll, der ich bin Ich baue mich auch selbst. Die App wird alle möglichen Inhalte von der API bekommen, aber im Moment muss ich nur die Verfügbarkeit der API durch eine Handshake-Funktion überprüfen.Unerwarteter nicht voider Rückgabewert in der void-Funktion - JSON Daten von dataTask (mit: 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() 

Dies ist die dataTask ist ich eingerichtet haben und es läuft ganz gut (Wenn ich die JsonResult drucken, ich das „Willkommen!“ Bekommen Nachricht wie erwartet. Das Problem ist, dass ich meine Handshake-Funktion zurückkehren wollen true oder false (Damit kann ich eine Warnung ausgeben, wenn der Fall falsch ist.) Wenn ich versuche, in der if-Anweisung eine Rückgabe wahr oder falsch einzurichten, erhalte ich den Fehler: Unerwarteter nicht void-Rückgabewert in der void-Funktion.

Meine Frage ist: Wie kann ich die Daten aus dem dataTask zurückkehren, damit ich Schecks mit ihm in meiner Handshake-Funktion durchführen kann, ich bin sehr neu für Swift so alle Hilfe ist willkommen :)

? 0

Im Folgenden finden Sie die ganze Klasse:

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

Mögliches Duplikat von [Zurückgeben von Daten aus dem asynchronen Aufruf in der Swift-Funktion] (http://stackoverflow.com/questions/25203556/returning-data-from-async-call-in-swift-function) – vadian

+0

Mögliche Duplikate von [ Wie kann ich die Daten von NSURLSession.sharedSession() .dataTaskWithRequest] (http://stackoverflow.com/questions/31264172/how-can-i-get-the-data-from-nsurlessions-sharedsession-datataskwithrequest) abrufen – Moritz

Antwort

0

Weil Sie eine asynchrone API verwenden, können Sie die Bool aus Ihrer handshake Funktion nicht zurückgeben kann. Wenn Sie eine Benachrichtigung in den falschen Fall zeigen wollen, würden Sie die return false mit so etwas wie ersetzen:

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

Technisch Sie könnte die Handshake-Funktion Pause machen, bis wurde das Netzwerk Sachen gemacht, und schicken Sie das Bool, Aber das vereitelt den Zweck, asynchron zu sein, und es würde die Benutzeroberfläche Ihrer App während der Netzwerkaktivität einfrieren, also bezweifle ich, dass Sie das tun wollen.

Verwandte Themen