2016-04-05 5 views
-1

Ich experimentiere mit Async-Anrufe, aber ich bin ein wenig verloren. Die print(json) in der viewDidLoad gibt ein leeres Wörterbuch aus, aber das innerhalb der Funktion druckt korrekt. Dies ist nicht überraschend; Es kommt zu diesem Druck, bevor der Async abgeschlossen ist. Ich kann nicht herausfinden, wie ich es beheben kann; Ich habe versucht, die Rückkehr in den Abschluss-Handler, aber ich habe einen Fehler, dass Unexpected non-void return value in void function. Ich habe versucht, den Completion-Handler zu ändern, um einen Rückgabewert zu erwarten, aber entweder ist das nicht der richtige Ansatz oder ich habe es falsch gemacht.Fügen Sie einen Return-Handler in Async-Aufruf in Swift

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let json = getJson("https://maps.googleapis.com/maps/api/geocode/json?address=WashingtonDC&sensor=false") 
     print(json) 
    } 

    func getJson(url: String) -> AnyObject { 
     var json:AnyObject = [:] 
     let urlPath = NSURL(string: url) 
     let urlRequest = NSURLRequest(URL: urlPath!) 
     let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
     let session = NSURLSession(configuration: config) 
     let task = session.dataTaskWithRequest(urlRequest, completionHandler: { 
      (data, response, error) in 
      if error != nil { 
       print("Error") 
      } else { 
       do { 
        json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) 
        print(json) 
       } catch { 
        print("json error") 
       } 

      } 
     }) 
     task.resume() 
     return json 
    } 
} 
+0

Randbemerkung: Ich fühle mich wie ich nicht wirklich richtig den Aufbau der json variablen Struktur, so dass jede Rückmeldung gibt es auch hilfreich! – thumbtackthief

Antwort

1

Sie müssen eine Schnittstelle zum Abschluss-Handler für Ihre asynchrone API haben.

func getJson(url: String, completion : (success: Bool, json: AnyObject?) ->Void) -> Void { 
     var json:AnyObject = [:] 
     let urlPath = NSURL(string: url) 
     let urlRequest = NSURLRequest(URL: urlPath!) 
     let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
     let session = NSURLSession(configuration: config) 
     let task = session.dataTaskWithRequest(urlRequest, completionHandler: { 
      (data, response, error) in 
      if error != nil { 
       print("Error") 
      } else { 
       do { 
        json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) 
        print(json) 
//Call the completion handler here: 
completion(success : true, json :json) 
        } catch { 
        print("json error") 
completion(success : false, json :nil) 

       } 

      } 
     }) 
     task.resume() 
    } 
} 

Sie diese API als folgt-

Nun rufen rufen
override func viewDidLoad() { 
     super.viewDidLoad() 
     getJson("https://maps.googleapis.com/maps/api/geocode/json?address=WashingtonDC&sensor=false") { (success, json) -> Void in 
     if success { 
      if let json = json { 
      print(json) 
     } 
     } 
    } 
    } 
+0

Ich habe versucht, dies selbst zu bearbeiten, aber es wurde abgelehnt: In der ersten Zeile sagt der Completion-Handler "result", aber später benutzt man "success". Ist das beabsichtigt oder ein Fehler? In anderen Nachrichten funktioniert Ihr Code gut, aber ich habe Probleme, es zu verstehen. Ich habe die Completion Handler nachgeschlagen, war aber verwirrter als zuvor (die Syntax allein verwirrt mich sehr). Jede Klärung, die Sie (oder irgendjemand) zur Verfügung stellen könnte, wäre eine große Hilfe! – thumbtackthief

+0

Auch: 'completion (Erfolg: false, son: nil)' sollte 'json: nil' sein. Bearbeiten ist zu klein für mich, um den Tippfehler zu beheben. – thumbtackthief

+1

@thumbtackthief danke für den Hinweis, habe ich bearbeitet. Sie waren alle Tippfehler, als ich spontan die Antwort eintippte. Hoffe jetzt alles gut. – Shripada

Verwandte Themen