2016-04-21 11 views
0

Ich versuche, alle Tierobjekte basierend auf bestimmten Parametern wiederherzustellen. Zuerst muss ich ihren Standort aus Parse sowie den Namen abrufen, aber da ich mehr als einen importiere und einen Geocoder verwende, verwende ich Strings und kein Array. Anstatt die importierten Informationen an ein Array anzuhängen, mutiere ich eine Variable mutieren. Was ich jedoch passieren würde ist, dass die Abfrage durch das erste Objekt gehen würde, dann die retrieveLocation-Methode ausführen würde, dann zum nächsten aus parse importierten Objekt fortfahren, aber stattdessen alles importieren und dann die Methode ausführen, sodass ich am Ende nur ein Objekt bekomme davon, wie viele importiert werden sollen.Warum wird die Methode am Ende ausgeführt?

let query = PFQuery(className: "Animals") 
    query.findObjectsInBackgroundWithBlock { (objects: [PFObject]?, error: NSError?) in 
     if(error == nil){ 
      for object in objects!{ 
         if let addressobj = object["Add"] as? NSDictionary{ 
          if let address = addressobj["address"] as? String{ 

           self.addr = address 
           print("sdfadsf \(self.addr)") 

          } 
         } 
         if let name = object["Name"] as? String{ 
          self.impname = name 
          print("rturrty \(self.impname)") 
          self.retrieveLocation() 
         } 
       } 
      } 
     } 
func retrieveLocation(){ 
    let geocoder = CLGeocoder() 

     geocoder.geocodeAddressString(addr, completionHandler: {(placemarks, error) -> Void in 
      if((error) != nil){ 
       print("Error", error) 
      } 
      if let placemark = placemarks?.first { 
       let coordinates = PFGeoPoint(location: placemark.location) 
       if(whatever is true){ 
       append the name and address into an array. This is the part where I just get repeats of the LATEST imported object. 
       } 
      } 

     }) 

} 
+0

ist 'retrieveLocation()' asynchron oder synchron? Meine Annahme ist, dass es asynchron ist, was bedeutet, dass die Funktion die for-Schleife erreicht, durch bedingte Bindung fortfährt, und nach Aufruf von 'retrieveLocation()' kehrt die Methode sofort zum Aufrufer zurück, der dann wieder durch die for-Schleife iteriert. vor 'retrieveLocation()' ruft tatsächlich den gewünschten Ort ab. vielleicht mache 'retrieveLocation()' synchron, oder füge einfach alle deine Adressen an dein Array an und wiederhole das Array, was wahrscheinlich die beste Option ist. – MikeG

+0

Ja, es ist asynchron, wie würde ich es synchron machen? – user6032625

+0

Sie können in großen zentralen Versand einlesen, um zu beginnen. Sie können eine synchrone Warteschlange aufrufen, indem Sie 'dispatch_sync (...)' in einer der vordefinierten globalen Warteschlangen aufrufen. Keine Garantie, dass dies Ihr Problem jedoch löst. Warum möchten Sie die Adressen nicht an ein Array anhängen? – MikeG

Antwort

0

Dies sollte funktionieren, wenn Sie eine lokale Variable verwenden und diese lokale Variable auf eine Implementierung von retirveLocation geben, dass self.addr von der Zeit zu sein retrieveLocation(address: String)

let query = PFQuery(className: "Animals") 
query.findObjectsInBackgroundWithBlock { (objects: [PFObject]?, error: NSError?) in 
    if(error == nil){ 
     for object in objects!{ 
     if let addressobj = object["Add"] as? NSDictionary{ 
     if let address = addressobj["address"] as? String{ 

     let newAddress = address 
     print("sdfadsf \(self.addr)") 

     } 
     } 
    if let name = object["Name"] as? String{ 
    self.impname = name 
    print("rturrty \(self.impname)") 
    self.retrieveLocation(newAdress) 
    } 
    } 
} 
} 

func retrieveLocation(address: String){ 
    let geocoder = CLGeocoder() 

    geocoder.geocodeAddressString(address, completionHandler: {(placemarks, error) -> Void in 
     if((error) != nil){ 
      print("Error", error) 
     } 
     if let placemark = placemarks?.first { 
      let coordinates = PFGeoPoint(location: placemark.location) 
      if(whatever is true){ 
       append the name and address into an array. This is the part where I just get repeats of the LATEST imported object. 
      } 
     } 

    }) 

} 

Problem scheint eine Zeichenfolge als Paramter nimmt Wird in der geocodeAddresString-Methode verwendet, ist die for-Schleife beendet und überschreibt somit alle vorherigen Werte, die an einer Stelle einzeln von self.addr gehalten wurden. Durch die Verwendung einer lokalen Variablen wird sichergestellt, dass bei jeder Ausführung ein eindeutiger Wert für geocodeAddressString verwendet wird.

+0

Hat diese Lösung für Sie funktioniert @ user6032625? – MikeG

Verwandte Themen