2014-07-01 3 views
6

Ho una semplice UITableView con UISearchBar/UISearchDisplayController che recupera risultati dal server remoto elasticsearch utilizzando RKObjectManager. Il problema che ho è che se l'utente digita rapidamente o il termine è un po 'più grande, molte delle richieste falliscono e a volte non ottengo i risultati.iOS: Attendere utente termina la digitazione e quindi invia una richiesta

C'è un'opzione per attendere fino a quando l'utente ha smesso di digitare e quindi inviare la richiesta invece di inviare richiesta per ogni lettera in cui digita?

risposta

22

Aggiungi un piccolo ritardo prima di inviare la richiesta, e quindi annullare tale richiesta in ritardo, se l'utente continua a digitare

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    [NSObject cancelPreviousPerformRequestsWithTarget:self]; 

    [self performSelector:@selector(sendSearchRequest) withObject:searchText afterDelay:0.1f]; 
} 

potrebbe essere necessario regolare il tempo di ritardo. troppo a lungo e la sua evidente per l'utente che v'è un ritardo, troppo breve e si ha lo stesso problema come ora

+0

Qualsiasi idea di come implementare che in rapida? – Ram

+0

@Ram Ho usato le risposte suggerite qui come soluzione alternativa per mancanza di performSelector in swift: http://stackoverflow.com/questions/24170282/swift-performselector-withobject-afterdelay – wattson12

+0

wow, grazie. inciampo su questo post ma ricordo solo che posso invalidare il nstimer. grazie assegnato – Ram

7

Questo è per la versione rapida

NSObject.cancelPreviousPerformRequestsWithTarget(self) 
self.performSelector("searchForText:", withObject: searchString, afterDelay: 0.5) 
+0

Grazie per il codice swift! – Steve