6

Ho un UISearhBarController nella mia app. Cerca attualmente un database online, ma lo sto cambiando per cercare invece un database di dati di base. La sua attualmente utilizzando questo codice:Utilizzo di NSFetchedResultsController con UISearchBar

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    if (self.billingSearchBar == searchBar) { 
     [self.billingSearchController filterResultsUsingString:searchText]; 
    } 
} 

- (void)filterResultsUsingString:(NSString *)filterString 
{ 
    self.billingSearchText = filterString; 
    NSArray *billing_codes = [self billingSearch:self.billingSearchText searchType:self.billingSearchCategory]; 
    self.displayedBillingSearch = billing_codes; 
    self.billingSearch = billing_codes; 
    [self.tableView reloadData]; 
} 

-(NSMutableArray*)billingSearch:(NSString*)searchString searchType:(NSString*)searchType 
{ 
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/server/20111115/60b88126/billing_search/", [self getHost]]]; 

    ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:url] autorelease]; 
    [request setPostValue:searchString forKey:@"query"]; 
    [request setPostValue:searchType forKey:@"category"]; 

    [request startSynchronous]; 
    NSError *error = [request error]; 
    NSString *responseString; 
    if (!error) { 
     responseString = [request responseString]; 
    } 

    NSMutableArray *search_results = [[NSMutableArray alloc] init]; 
    NSDictionary *responseDictionary = [responseString JSONValue]; 

    for (id key in [responseDictionary valueForKey:@"search_results"]) { 
     [search_results addObject:key]; 
    } 
    return search_results; 
} 

così ho la messa a punto del database nei dati di base già, ho solo bisogno di collegare il controller di ricerca/NSFetchedResults ad esso. Qualche modo semplice per farlo?

risposta

6

Il modo più semplice per farlo consiste nell'utilizzare due NSFetchedResultsControllers e impostare il predicato sul NSFRC "di ricerca" come searchText in UISearchBar. Dopo aver deciso quale NSFRC utilizzare, è sufficiente impostare self.fetchedResultsController = "ricerca" NSFRC o "predefinito" NSFRC.

È anche possibile utilizzare lo stesso NSFRC e modificare il predicato, ma non è il modo consigliato di farlo.

Vedere il commento qui sotto. Se tutto ciò che sta cambiando è il predicato, un FRC va bene.

Ecco il codice di esempio per ottenere questo fatto:

// First use the Searchbar delegate methods 
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    [self filterContentForSearchText:searchText]; 
} 

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { 
    [self filterContentForSearchText:searchBar.text]; 
    [searchBar resignFirstResponder]; 
} 

// The method to change the predicate of the FRC 
- (void)filterContentForSearchText:(NSString*)searchText 
{ 
    NSString *query = searchText; 
    if (query && query.length) { 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@ or department contains[cd] %@", query, query]; 
     [self.fetchedResultsController.fetchRequest setPredicate:predicate]; 
     [self.fetchedResultsController.fetchRequest setFetchLimit:100]; // Optional, but with large datasets - this helps speed lots 
    } 

    NSError *error = nil; 
    if (![[self fetchedResultsController] performFetch:&error]) { 
     // Handle error 
     exit(-1); 
    } 

    [self.myTableView reloadData]; 
} 

Questo dovrebbe ya iniziare.

+2

Non sono d'accordo. Dove dice che cambiare il predicato è "non è il modo consigliato per farlo"? Più facile e più pulito per aggiornare il predicato 'NSFetchRequest' ed eseguire un nuovo recupero. Avere più 'NSFetchedResultsControllers' non ha senso. – gschandler

+1

Si è corretto, stavo pensando a quando sono coinvolti due set di dati distinti, quando il set di dati non sta cambiando e solo il predicato è, un FRC funzionerà correttamente. –

+0

Soluzione semplice ed efficiente! – Giovanni

Problemi correlati