2016-07-19 11 views
0
func getLatsAndLongs() -> (LATITUDE: Double, LONGITUDE: Double, DESIREDLAT: Double, DESIREDLONG: Double) { 



    self.forwardGeocoding("\(addressTxtFld.text) \(cityTxtFld.text), \(stateTxtFld.text)", completion: { 
     success, coordinate in 

     if success { 
      self.lat = coordinate.latitude 
      self.long = coordinate.longitude 

      print("\(self.lat) is the latitude for the initial location") 
      print("\(self.long) is the longitude for the initial location") 

      self.INITIAL_DESTINATION_LATITUDE = self.lat 
      self.INITIAL_DESTINATION_LONGITUDE = self.long 

      var initialLocation = CLLocationCoordinate2DMake(self.INITIAL_DESTINATION_LATITUDE, self.INITIAL_DESTINATION_LONGITUDE) 



     } else { 
      print("Error at forwardGeocoding @willcohen @ERRORALERT") 
     } 
    }) 


    self.forwardGeocodingDesired("\(addressTxtFldDest.text) \(cityTxtFldDest.text), \(stateTxtFldDest.text)", completion: { 
     success, coordinate in 

     if success { 
      self.desiredLat = coordinate.latitude 
      self.desiredLong = coordinate.longitude 

      print("\(self.desiredLat) is the latitude for the desired location") 
      print("\(self.desiredLong) is the longitude for the desired locaiton") 

      self.DESIRED_DESTIANTION_LATITUDE = self.desiredLat 
      self.DESIRED_DESTINATION_LONGITUDE = self.desiredLong 

      var desiredLocation = CLLocationCoordinate2DMake(self.DESIRED_DESTIANTION_LATITUDE, self.DESIRED_DESTINATION_LONGITUDE) 




     } else { 
      print("Error at forwardGeocodingDesired @willcohen @ERRORALERT") 
     } 

    }) 

    return (lat,long,desiredLat,desiredLong) 

} 


      let latsAndLongs = getLatsAndLongs() 

     let latFF = latsAndLongs.LATITUDE 
     let longFF = latsAndLongs.LONGITUDE 
     let latDFF = latsAndLongs.DESIREDLAT 
     let longDFF = latsAndLongs.DESIREDLONG 

     print("\(latFF) final lat") 
     print("\(longFF) final long") 
     print("\(latDFF) final latD") 
     print("\(longDFF) final longD") 

Okay. Wenn ich also versuche, alle Zeilen der letzten 4 Zeilen zu drucken, wird jedes Mal "0" ausgegeben. Beachten Sie, dass die beiden Geocodierungszeilen (self.forwardGeocoding) & (self.forwardGeocodingDesired) nicht die Probleme sind, sie funktionieren gut, aber ich habe keine Ahnung, warum sie nicht die richtigen Double-Werte drucken. Irgendwelche Vorschläge würden sehr geschätzt werden, danke.swift Funktion Rückgabewerte werden nicht korrekt zurückgegeben

Antwort

0

Überprüfen Sie, ob die Completion-Blöcke in self.forwardGeocoding und self.forwardGeocodingDesired asynchron ausgeführt werden. Wenn dies der Fall ist, werden die Werte erst eingestellt, nachdem die Drucke ausgeführt wurden.

+0

sie asynchron tun auszuführen. Wenn es Ihnen nichts ausmacht, wie würde ich das beheben? –

1

forwardGeocoding und forwardGeocodingDesired rufen Sie eine Operation über das Netzwerk auf, deren Ausführung einige Zeit in Anspruch nimmt. Dies geschieht mithilfe eines Hintergrundthreads, um die Benutzeroberfläche nicht zu blockieren. Wenn die Operationen abgeschlossen sind, wird der Code in den Beendigungsabschlüssen ausgeführt.

Ihre getLatsAndLongs Funktion gibt lat, long, desiredLat und desiredLong bevor die Vorgänge abgeschlossen haben und deshalb vor diesen Variablen durch Ihre Schließung festgelegt wurden.

Sie können einen Beendigungshandler an getLatsAndLongs übergeben, der nach Abschluss der Vorgänge aufgerufen wird. Ihre Situation ist jedoch kompliziert, weil Sie zwei Geocodierungsoperationen parallel ausführen und nicht wissen, welcher zuerst beendet wird. Sie könnten die zweite aus dem Completion-Handler des ersten versenden, aber das wird langsamer. Ein besserer Ansatz ist es, eine dispatch_group zu verwenden:

func getLatsAndLongs(completion:(initialLocation: CLLocationCoordinate2D?, desiredLocation: CLLocationCoordinate2D?)->Void) { 

    let dispatchGroup = dispatch_group_create() 

    var initialLocation: CLLocationCoordinate2D? 
    var desiredLocation: CLLocationCoordinate2D? 

    dispatch_group_enter(dispatchGroup) 

    self.forwardGeocoding("\(addressTxtFld.text) \(cityTxtFld.text), \(stateTxtFld.text)", completion: { 
     success, coordinate in 
     if success { 
      initialLocation = coordinate 
     } else { 
      print("Error at forwardGeocoding @willcohen @ERRORALERT") 
     } 
     dispatch_group_leave(dispatchGroup) 
    }) 


    self.forwardGeocodingDesired("\(addressTxtFldDest.text) \(cityTxtFldDest.text), \(stateTxtFldDest.text)", completion: { 
     success, coordinate in 

     if success { 
      desiredLocation = coordinate 
     } else { 
      print("Error at forwardGeocodingDesired @willcohen @ERRORALERT") 
     } 
     dispatch_group_leave(dispatchGroup) 
    }) 

    dispatch_group_notify(dispatchGroup, dispatch_get_main_queue()) { 
     completion(initialLocation:initialLocation,desiredLocation:desiredLocation) 
    } 
} 

Verbrauch:

getLatsAndLongs { (initialLocation, desiredLocation) in 
    print(initialLocation) 
    print(desiredLocation) 
} 
+0

Ich habe die Änderungen, die Sie gemacht haben, und dann hieß es wie Sie sagten, aber ich habe einen Fehler in meiner appDelegate.swift, die 'Thread 1: EXC_BAD_INSTRUCTION (Code = EXC_I386_INVOP, Subcode = 0x0)' –

+0

Möglicherweise etwas war Null und du hast es ausgepackt. Da ich nicht die Quelle für 'forwardGeocodingDesired' und' forwardGeocoding' hatte, habe ich eine Annahme gemacht, dass 'coordinate' ein CLLocationCoordinate2D ist - Das könnte falsch sein und Sie sollten die Dinge entsprechend anpassen. – Paulw11

+0

In welcher Zeile ist der Absturz aufgetreten? Versuchen Sie, einen Ausnahmehaltepunkt festzulegen – Paulw11

Verwandte Themen