2017-02-14 4 views
1

Im mit MapKit CLGeocoder(). GeocodeAddressString(), um die Koordinaten und County-Informationen für eine Liste von Adressen zu erhalten. Alles funktioniert gut, solange die Anzahl der Anfragen unter 50 ist, aber alles über 50 und ich habe das Limit der API erreicht. Da CLGeocoder-Aufrufe asynchron sind, kann ich den Fluss der Anrufe (z. B. das Anrufen einer Adresse) nicht einfach steuern/steuern. Wie würde ich das in der "asynchronen Welt" richtig machen? (Disclaimer: Ich bin neu in der Welt der GCD und asynchronen Flusskontrolle, so dass ich glaube, ich könnte eine ausführlichere Antwort erfordern)CLGeocoder geocodeAddressString() trifft das Limit

Hier ist der entsprechende Code:

Methode der Klasseneigenschaft, die CLGeocoder auf die Anrufe Unterkunft Adresse:

func initializeCoordinates() { 

     let addressForCoords = self.address.getAddress() 
     CLGeocoder().geocodeAddressString(addressForCoords, completionHandler: { (placemarks, error) -> Void in 
      if error != nil { 
       print(error!) 
       return 
      } 
      if placemarks!.count > 0 { 
       let placemark = placemarks?[0] 
       let location = placemark?.location 
       self.coordinates = location?.coordinate 

       if let subAdminArea = placemark?.subAdministrativeArea { 
        self.address.county = subAdminArea 
       } 
      } 
     }) 
    } 

und dann in dem Abschnitt, in dem ImportVC, die alle die Unterkunft Adressen aus einem textBox importiert (und machen den Anruf zu initializeCoordinates Methode auf jeder Eigenschaft:

for line in importText { 
     let newAddress = Address() 
     let newHouse = Property() 

     // parse the tab delimited address for each line of input 
     let address = line.components(separatedBy: "\t") 
     if address.count == 4 { 
      newAddress.street = address[0] 
      newAddress.city = address[1] 
      newAddress.state = trimState(state: address[2]) 
      newAddress.zip = address[3] 
      newHouse.address = newAddress 
      newHouse.initializeCoordinates() 
      houses.append(newHouse) 
     } 
    } 

Antwort

0

Ich hatte in letzter Zeit ein ähnliches Problem. Ersetzen Sie Ihre for-Schleife durch eine rekursive Funktion, die sich am Ende aufruft. Der Trick besteht jedoch darin, sich selbst mit einer Verzögerung von 0,2 Sekunden anzurufen. Ich benutze 0,4, um auf der sicheren Seite zu sein. Dies erhöht die Wartezeit für den Benutzer, obwohl wir aufgrund des API-Limits keine Wahl haben.

Verwandte Themen