2009-07-29 5 views
0

Une grande partie de mon code est basée sur l'exemple TableSearch d'Apple, mais mon application contient 35 000 cellules à rechercher plutôt que quelques exemples dans l'exemple. Il n'y a pas beaucoup de documentation en ligne sur UISearchDisplayController car elle est relativement nouvelle. Le code que je utilise est la suivante:Ajustement de l'algorithme iPhone TableSearch pour éviter le retard de l'interface utilisateur

- (void)filterContentForSearchText:(NSString*)searchText { 
/* 
Update the filtered array based on the search text and scope. 
*/ 

[self.filteredListContent removeAllObjects]; // First clear the filtered array. 

/* 
Search the main list for products whose type matches the scope (if selected) and whose name matches searchText; add items that match to the filtered array. 
*/ 
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
for (Entry *entry in appDelegate.entries) 
{ 
    if (appDelegate.searchEnglish == NO) { 
     NSComparisonResult result = [entry.gurmukhiEntry compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])]; 
     if (result == NSOrderedSame) 
     { 
      [self.filteredListContent addObject:entry]; 
     } 
    } 
    else { 
     NSRange range = [entry.englishEntry rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
     if(range.location != NSNotFound) 
     { 
      [self.filteredListContent addObject:entry]; 
     } 

    } 
}} 
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 
[self filterContentForSearchText:searchString]; 
[self.view bringSubviewToFront:keyboardView]; 

// Return YES to cause the search result table view to be reloaded. 
return YES;} 

Mon problème est qu'il ya un peu de retard après chaque bouton est appuyé sur le clavier. Cela devient un problème de convivialité, car l'utilisateur doit attendre après avoir tapé chaque caractère que l'application recherche dans le tableau pour les résultats correspondants. Comment ce code peut-il être ajusté pour que l'utilisateur puisse taper continuellement sans aucun retard? Dans ce cas, le délai de rechargement des données peut être retardé, mais le clavier ne doit pas tenir le clavier en cours de saisie.

Répondre

0

Mise à jour:

Une façon de acccomplish searchching lors de la frappe sans « enfermer » l'interface utilisateur, est d'utiliser les threads.

vous pouvez donc appeler la méthode qui effectue le tri avec cette méthode:

- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg 

qui gardera hors du fil conducteur, ce qui permet la mise à jour de l'interface utilisateur.

Vous devrez créer et drainer votre propre piscine Autorealease sur le fil d'arrière-plan.

Toutefois, lorsque vous souhaitez mettre à jour la table que vous devrez message au thread principal (toutes les mises à jour l'interface utilisateur doivent être sur le thread principal):

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait 

Vous pouvez également obtenir un peu plus de contrôle en utilisant NSOperation/NSOperationQueue ou NSThread.

Notez que la mise en œuvre de threads est lourde de dangers. Vous devrez vous assurer que votre code est thread-safe et vous pouvez obtenir des résultats imprévisibles.

De plus, voici d'autres réponses stackoverflow qui peuvent aider:

Using NSThreads in Cocoa?

Where can I find a good tutorial on iPhone/Objective-C multithreading?


réponse originale:

Ne pas effectuer la recherche jusqu'à ce que l'utilisateur appuie sur la "Rechercher" le bouton.

Il y a une méthode déléguée, vous pouvez mettre en œuvre pour prendre la pression du bouton de recherche:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar; 
+0

pas exactement ce que je cherche ... Je l'ai vu faire avant où les types d'utilisateurs et il y a un retard dans le chargement de la table mais il est séparé du clavier qui pourrait taper librement pour la grande base de données. – Kulpreet

+0

Je viens d'upated ma réponse à quelque chose qui peut être plus pertinent –

Questions connexes