2017-12-07 3 views
0

Ich versuche, eine Suchleiste zu implementieren, wo der Benutzer eine Zeichenfolge eingeben und nach einer Adresse oder einem Geschäft suchen kann.Warum erhalte ich bei einer lokalen Suche einen MKErrorDomain-Fehler?

Unternehmen zu finden I Yelp APIs verwenden, um die Informationen die ich brauche auszulagern.

Adressen zu finden Ich benutze MKLocalSearch APIs Apple die Informationen, die ich brauche zu bekommen.

Allerdings habe ich ein Problem. Wenn ich auf die Rücktaste halten, um den Text aus der Suchleiste zu löschen oder zu schnell in die Suchleiste eingeben Ich erhalte ein MKErrorDomain Fehler:

The operation couldn’t be completed. (MKErrorDomain error 3.)

Wenn ich diesen Fehler werde ich warten müssen, ein paar Momente, damit der Code wieder funktioniert und Informationen von den APIs abgerufen werden kann.

Der folgende Code ist, was muss ich umsetzen, was ich suche:

Dies ist die Suchleiste Delegatmethode:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 

    if searchBar.text == "" { 
     addServiceCellToTableView() 
     loadSearchHistory() 
     return 
    } else if searchBar.text != "" { 
     removeServiceCellFromTableView() 
    } 


    if searchCompleter.isSearching{ 
     searchCompleter.cancel() 
     searchCompleter.region = (delegate?.businessSearchResultTableViewControllerNeedsUpdatedMapRegion(self))! 
     searchCompleter.queryFragment = searchText 
    } else { 
     searchCompleter.region = (delegate?.businessSearchResultTableViewControllerNeedsUpdatedMapRegion(self))! 
     searchCompleter.queryFragment = searchText 
    } 

} 

ich MKLocalSearchCompleter verwenden Vorschläge auf, was der Benutzer tippt zu bekommen basiert in die Suchleiste:

func completerDidUpdateResults(_ completer: MKLocalSearchCompleter){ 

    guard completer.results.count != 0 else {return} 

    var searchTerm: String = completer.results.first!.title 
    if completer.results.first!.subtitle != "" { 
     searchTerm = searchTerm + ", " + completer.results.first!.subtitle 
    } 


    if let _ = addressDetector.firstMatch(in: searchTerm, options: [], range: NSMakeRange(0, searchTerm.utf8.count)){ 
     searchAddress(for: searchTerm) 
    } else { 
     getBusinesses(withSearchTerm: searchTerm, userCoordinates: currentUserLocation.coordinate) 
    } 


} 

In dem obigen Code I NSDataDetector sehen verwenden, wenn der vorgeschlagene Text eine Adresse ist ... wenn so dass ich es mit Hilfe MKLocalSearch ...

Schließlich Um nach Adressen zu suchen ich eine Methode definiert searchAddress(for:) genannt:

func searchAddress(for string: String){ 

     let localSearchRequest = MKLocalSearchRequest() 
     localSearchRequest.naturalLanguageQuery = string 
     localSearchRequest.region = (delegate?.businessSearchResultTableViewControllerNeedsUpdatedMapRegion(self))! 

     let localSearch = MKLocalSearch(request: localSearchRequest) 
     localSearch.start(completionHandler: {searchResponse, error in 
      guard error == nil else { 
       print(error.debugDescription) 
       return 
      } 

      guard let mapItems = searchResponse?.mapItems else {return} 

      self.tableViewDataSourceList = mapItems 
      self.tableView.reloadData() 
      self.delegate?.businessSearchResultTableViewStopedGettingBusiness(self, with: self.tableViewDataSourceList, at: CLLocationCoordinate2D(latitude: self.currentUserLocation.coordinate.latitude, longitude: self.currentUserLocation.coordinate.longitude)) 
     }) 
    } 

Wenn ich zu schnell eingeben oder halten Sie auf dem Rücktaste ich das bekommen folgende Fehler in der Konsole:

The operation couldn’t be completed. (MKErrorDomain error 3.) 
The operation couldn’t be completed. (MKErrorDomain error 3.) 
The operation couldn’t be completed. (MKErrorDomain error 3.) 
The operation couldn’t be completed. (MKErrorDomain error 3.) 
The operation couldn’t be completed. (MKErrorDomain error 3.) 
The operation couldn’t be completed. (MKErrorDomain error 3.) 
The operation couldn’t be completed. (MKErrorDomain error 3.) 
The operation couldn’t be completed. (MKErrorDomain error 3.) 

Jede Hilfe wird viel :-)

Antwort

1

geschätzt werden hier Was Sie sehen, ist die MKError.loadingThrottled Fehler. Sie müssen die Anfragen, die Sie an Apple senden, verzögern.

Sie können dies tun, der Benutzer eine Timer jedes Mal durch einen Neustart der Suchabfrage aktualisiert. Sie können einstellen, wie häufig Sie die API pingen, indem Sie die Länge des Timers verlängern. Durch Zurücksetzen des Timers bei jeder Aktualisierung der Abfrage vermeiden Sie das Senden mehrerer Anfragen, wenn sich die Zeichen schnell ändern.

// declare and store Timer somewhere 

func searchAddress(with query: String) { 

} 

func timerDidFire(_ sender: Any) { 
    let query = textField.text 
    searchAddress(with: query) 
} 

Timer.scheduledTimerWithTimeInterval(0.5, target: self, selector: #selector(timerDidFire), userInfo: nil, repeats: false) 
+0

Haben Sie einen Beispielcode, den ich mir anschauen könnte oder ein Tutorial, auf das Sie mich hinweisen könnten? –

+0

@ A.Jam so etwas wie dies funktionieren würde https://stackoverflow.com/a/38987761/4080860 – hhanesand

+0

So eine Sache, ich bin nicht sicher: schlagen Sie den gesamten Code in der Suchleiste Delegat in den 'searchTime' Wähler bewegen Methode in dem Beispiel, das Sie mir gerade gezeigt haben? –

Verwandte Themen