2016-09-28 4 views
1

Ich habe diese Funktion, und ich möchte das Standort-Array mit Breiten-/Längengraddaten füllen, die ich in der DataTask-Funktion bekomme.Probleme beim Abrufen meiner Daten datatask swift 3

Das Problem ist, dass die Daten nur in der Datatask-Funktion verfügbar sind und außerhalb davon ist es weg.

func getFromDatabase() 
{ 
    var locations: [CLLocationCoordinate2D] = [] 
    let url = URL(string: URL_DATABASESend) 

    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in 
     //Here I print the JSON: print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue)!) 
     do{ 
      if(data != nil){ 
       let parsedData = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [[String:String]] 
        for dic in parsedData! { 
        if let lat = Double(dic["latitude"]!), let long = Double(dic["longitude"]!) { 
         //print(lat) 
         //print(long) 
         var coordinatesToAppend = CLLocationCoordinate2D(latitude: lat, longitude: long) 
         locations.append(coordinatesToAppend) 
        } 
       } 
      }} catch let error as NSError{ 
      print(error.localizedDescription) 
      return 
     } 
    } 
    task.resume() 
} 

Ich weiß nicht, wie einen completionhandler verwenden und wenn ich mir eine Menge Fehler bekommen tun (ich eine Menge Tutorials/Online-Hilfethemen gefolgt).

Kann jemand die Information aus der Funktion herausbekommen? (Kann den Wert nicht zurückgeben, weil ich datatask benutze) Ich lese viele Themen, aber nichts davon hat mein Problem gelöst.

Ich hoffe, etwas von euch zu hören!

+2

Mögliche Duplikat http://stackoverflow.com/questions/31264172/how-can-i-get-the-data-from-nsurlsession -sharedsession-datataskwithrequest – Moritz

+0

@EricAya Ich habe dieses Thema gelesen, aber es hat mir nicht geholfen ... Bitte hilf mir, dass ich wirklich will, dass es funktioniert, aber ich habe keine Programmiererfahrung, ich habe dir auch einen Twitter-Tweet geschickt. – royvano

+0

Kann ich mit dir reden @EricAya lassen Sie mich wissen, wie – royvano

Antwort

0

Sie müssen einen Rückruf verwenden, um Ihre Inhalte von der Schließung zu erhalten.

Ihr Inhalt ist dieser Array: var locations: [CLLocationCoordinate2D] so werden wir einen Rückruf wie diese verwenden:

completion: @escaping ([CLLocationCoordinate2D])->() 

Wir fügen diese die Methode Signatur:

func getFromDatabase(completion: @escaping ([CLLocationCoordinate2D])->()) 

Dann benutzen wir es in Ihr Code, wo der Inhalt bereit ist, direkt nach der Schleife:

func getFromDatabase(completion: @escaping ([CLLocationCoordinate2D])->()) 
{ 
    var locations: [CLLocationCoordinate2D] = [] 
    let url = URL(string: URL_DATABASESend) 

    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in 
     do { 
      if data != nil { 
       let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [[String:String]] 
       for dic in parsedData { 
        if let lat = Double(dic["latitude"]!), let long = Double(dic["longitude"]!) { 
         let coordinatesToAppend = CLLocationCoordinate2D(latitude: lat, longitude: long) 
         locations.append(coordinatesToAppend) 
        } 
       } 
       // Here the array is ready, we use the completion handler 
       completion(locations) 
      } 
     } catch let error as NSError { 
      print(error.localizedDescription) 
      return 
     } 
    } 
    task.resume() 
} 

Dann rufen Sie an Ihre Methode mit einem Hinter wie dieser Verschluss das Array zurück:

getFromDatabase { (locs) in 
    // Here "locs" is your [CLLocationCoordinate2D] array 
    print(locs) 
} 
Verwandte Themen