2017-04-02 4 views
1

Ich bin neu in swift3.0 Ich bin ein benutzerdefiniertes Suchfeld implementieren. Ich möchte wissen, wie ich eine Suchwarteschlange so machen kann, dass auf Textänderung in searchbox ich Suchoperation mit neuem Text durchführen muss und wenn es eine vorhandene Suchoperation gibt, annulliere das. Ich möchte auch einen Schwellenwert ontextchanged enthalten. So wird dieser Suchvorgang nicht sehr häufig ausgelöstSo implementieren Sie eine Suchwarteschlange

+0

Also, was ist das Problem mit 'UISearchController' ?? :/ –

+0

@agent_stack Ich möchte eine benutzerdefinierte UI wie Uber App erstellen. –

+0

Sie wollten also die TextField, wo Benutzer den Standort suchen können? Ist ich richtig? –

Antwort

1

Ihre Frage ist irgendwie allgemein, aber lassen Sie mich Ihnen sagen, wie ich dies in Swift 3 und AFNetworking (das geht davon aus, dass Sie nach den Daten auf dem Server suchen wollen).

halte ich eine Referenz des Netzwerkmanagers in den Eigenschaften des View-Controller:

//The network requests manager. Stored here because this view controller extensively uses AFNetworking to perform live search updates when the input box changes. 
var manager = AFHTTPRequestOperationManager() 

Danach UISearchController mit mir überprüfen, um zu sehen, ob es ein Text in dem Suchfeld überhaupt und trat, wenn es ist, ich sicherstellen möchten, da von nun durch das Schließen einer von ihnen keine anderen laufenden AFNetworking Aufgaben sind, die noch ausgeführt werden:

//Called when the something is typed in the search bar. 
func updateSearchResults (for searchController: UISearchController) { 
    if !SCString.isStringValid(searchController.searchBar.text) { 
     searchController.searchResultsController?.view.isHidden = false 
     tableView.reloadData() 
     return 
    } 
    data.searchText = searchController.searchBar.text! 

    /** 
     Highly important racing issue solution. We cancel any current request going on because we don't want to have the list updated after some time, when we already started another request for a new text. Example: 

     - Request 1 started at 12:00:01 
     - We clear the containers because Request 2 has to start 
     - Request 2 started at 12:00:02 
     - Request 1 finished at 12:00:04. We update the containers because data arrived 
     - Request 2 finished at 12:00:05. We update the containers because data arrived 
     - Now we have data from both 1 and 2, something really not desired. 
    */ 
    manager.session.getTasksWithCompletionHandler { (dataTasks, uploadTasks, downloadTasks) in 
     dataTasks.forEach { $0.cancel() } 
    } 

    /** 
     Reloads the list view because we have to remove the last search results. 
    */ 
    reloadListView() 
} 

Am Ende, überprüfe ich auch in der failure Schließung, wenn der Code der Fehler ist nicht NSURLErrorCancelled. Denn wenn das passiert, zeige ich keine Fehlermeldung oder Toast an.

//The operation might be cancelled by us on purpose. In this case, we don't want to interfere with the ongoing logic flow. 
if (operation?.error as! NSError).code == NSURLErrorCancelled { 
    return 
} 
self.retrieveResultListFailureNetwork() 

Hoffe es hilft!

+0

thanks dies hilft in Bezug auf HTTP-Anfrage und Antwort, aber ich bin tatsächlich in mehr generische suchen, wo ich jede Aufgabe hinzufügen und abbrechen kann, wenn eine neue Aufgabe kommt. –

Verwandte Themen