2016-11-22 5 views
6

Als ich versuchte, die umgekehrte Geokodierung zu verwenden, erschien diese Fehlermeldung.CLGeocoder-Fehler. GEOErrorDomain Code = -3

Geocode error: Error Domain=GEOErrorDomain Code=-3 "(null)"

Mein Code ist unten:

import CoreLocation 
geocoder.reverseGeocodeLocation(location) { (placemarks, error) in 
    if let placemarks = placemarks { 
     reverseGeocodeLocations[hash] = placemarks 
    } 
    callback(placemarks, error) 
} 

Dies funktioniert nur Zeit zu Zeit, und ich bitte reverseGeocode mehrmals pro Sekunde. Also ich denke diese Fehlermeldung bezieht sich auf das Limit der Anfrage oder etwas? Gibt es Dokumentation über Geocode-Anfrage von Apple? Danke für den Fortschritt.


Aktualisiert

hier ist meine gesamte Code für

anfordernden
import CoreLocation 

fileprivate struct ReverseGeocodeRequest { 

    private static let geocoder = CLGeocoder() 
    private static var reverseGeocodeLocations = [Int: [CLPlacemark]]() 
    private static let reverseGeocodeQueue = DispatchQueue(label: "ReverseGeocodeRequest.reverseGeocodeQueue") 

    private static var nextPriority: UInt = 0 

    fileprivate static func request(location: CLLocation, callback: @escaping ([CLPlacemark]?, Error?)->Void) { 
     let hash = location.hash 
     if let value = reverseGeocodeLocations[hash] { 
      callback(value, nil) 
     } else { 
      reverseGeocodeQueue.async { 
       guard let value = reverseGeocodeLocations[hash] else { 
        geocoder.reverseGeocodeLocation(location) { (placemarks, error) in 
         if let placemarks = placemarks { 
          reverseGeocodeLocations[hash] = placemarks 
         } 
         callback(placemarks, error) 
        } 
        return 
       } 
       callback(value, nil) 
      } 
     } 
    } 



    let priority: UInt 
    let location: CLLocation 
    let handler : ([CLPlacemark]?, Error?)->Void 

    private init (location: CLLocation, handler: @escaping ([CLPlacemark]?, Error?)->Void) { 
     ReverseGeocodeRequest.nextPriority += 1 
     self.priority = ReverseGeocodeRequest.nextPriority 
     self.location = location 
     self.handler = handler 
    } 

} 

extension ReverseGeocodeRequest: Comparable { 
    static fileprivate func < (lhs: ReverseGeocodeRequest, rhs: ReverseGeocodeRequest) -> Bool { 
     return lhs.priority < rhs.priority 
    } 
    static fileprivate func == (lhs: ReverseGeocodeRequest, rhs: ReverseGeocodeRequest) -> Bool { 
     return lhs.priority == rhs.priority 
    } 

} 


extension CLLocation { 

    func reverseGeocodeLocation(callback: @escaping ([CLPlacemark]?, Error?)->Void) { 
     ReverseGeocodeRequest.request(location: self, callback: callback) 
    } 

    func getPlaceName(callback: @escaping (Error?, String?)->Void) { 
     self.reverseGeocodeLocation { (placemarks, error) in 
      guard let placemarks = placemarks, error == nil else { 
       callback(error, nil) 
       return 
      } 
      guard let placemark = placemarks.first else { 
       callback(nil, "Mysterious place") 
       return 
      } 

      if let areaOfInterest = placemark.areasOfInterest?.first { 
       callback(nil, areaOfInterest) 
      } else if let locality = placemark.locality { 
       callback(nil, locality) 
      } else { 
       callback(nil, "On the Earth") 
      } 
     } 
    } 
} 
+0

haben Sie das gelöst? –

+1

@RayTso Nein, wir konnten nicht. Es scheint, als ob der Fehler auftritt, wenn wir mehrere Anfragen in kurzer Zeit stellen. Wir vermieden dieses Problem stattdessen mit Warteschlangen und Lazy Update. –

Antwort

7

Nachdem überall nach der Antwort gesucht wurde, war es in Apples docs! :/

https://developer.apple.com/reference/corelocation/clgeocoder/1423621-reversegeocodelocation

Geocoding requests are rate-limited for each app, so making too many requests in a short period of time may cause some of the requests to fail. When the maximum rate is exceeded, the geocoder passes an error object with the value network to your completion handler.

Wenn in dem Abschluss-Handler den Fehlercode überprüft es ist in der Tat Network Error: 2

hoffe, das hilft jemand!

+0

Welches ist die maximale Anzahl von Anfragen? – Ricardo

+1

@Ricardo Diese Nummer wird nicht von Apple veröffentlicht. Die einzigen Details, die sie geben, sind oben im Zitat. Ich glaube nicht, dass es eine maximale Anzahl von Anfragen gibt, aber es gibt eine Grenze dafür, wie schnell diese Anfragen rekursiv ausgeführt werden können. –

-1

Sind Sie Erholung der CLGeocoder(). Zum Beispiel habe ich eine Schleife, die durch ein Array von Koordinaten überprüft, wenn ich aber den CLGeocoder innerhalb der Schleife bekomme ich die gleiche Fehlermeldung wie du bist.

Hoffe, das hilft.

+0

Danke für die Antwort, aber ich verwende statische Variable für CLGeocoder. es ist keine Arbeit. –

+0

Können Sie Ihren Code posten? – AlexanderKaran

+0

Ich habe meinen Code aktualisiert. Danke. –