2010-12-12 22 views
6

Estoy tratando de buscar a través de unos pocos miles de objetos en mi aplicación de iPhone, sin embargo, la búsqueda está rezagada: después de cada pulsación, la IU se congela durante 1 - 2 segundos. Para evitar esto, tengo que ejecutar la búsqueda en una cadena de fondo.Buscando en un hilo de fondo

Me preguntaba si alguien tenía algunos consejos para buscar en un hilo de fondo? Leí un poco en NSOperation y busqué en la web, pero realmente no encontré nada útil.

Respuesta

6

Intente utilizar un NSOperationQueue como una variable de instancia en su controlador de vista.

@interface SearchViewController : UIViewController { 
    NSOperationQueue *searchQueue; 
    //other awesome ivars... 
} 
//blah blah 
@end 

@implementation SearchViewController 

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle { 
    if((self = [super initWithNibName:nibName bundle:nibBundle])) { 
     //perform init here.. 
     searchQueue = [[NSOperationQueue alloc] init]; 
    } 
    return self; 
} 

- (void) beginSearching:(NSString *) searchTerm { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    //perform search... 
    [self.searchDisplayController.searchResultsTableView reloadData]; 
    [pool drain]; 

} 

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
    /* 
     Cancel any running operations so we only have one search thread 
     running at any given time.. 
    */ 
    [searchQueue cancelAllOperations]; 
    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self 
                    selector:@selector(beginSearching:) 
                     object:searchText]; 
    [searchQueue addOperation:op]; 
    [op release]; 
} 

- (void) dealloc { 
    [searchQueue release]; 
    [super dealloc]; 
} 
@end 
+0

Gracias, busque dentro de -beginSearch parece funcionar, sin embargo, parece que no puedo obtener mis resultados en mi matriz original (que uso para mi 'UITableView') ...? ¿No es posible asignar desde un hilo separado? – fabian789

+0

@ fabian789 Espera, déjame editar mi respuesta ... –

+0

Lo hice así: '[self performSelectorOnMainThread: @selector (updateArray :) withObject: tmp_filter waitUntilDone: NO]', luego llamar a '[self.searchDisplayController.searchResultsTableView reloadData] 'from' updateArray'. Curioso por ver su solución ... – fabian789

Cuestiones relacionadas