为什么nspredicate不工作

- (NSFetchedResultsController *)fetchedResultsController { if (_fetchedResultsController != nil) { return _fetchedResultsController; } NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"KeyRefEntity" inManagedObjectContext:self.managedObjectContext]; [fetchRequest setEntity:entity]; [fetchRequest setFetchBatchSize:20]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"time" ascending:NO]; NSArray *sortDescriptors = @[sortDescriptor]; [fetchRequest setSortDescriptors:sortDescriptors]; NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"time" cacheName:@"Master"]; aFetchedResultsController.delegate = self; self.fetchedResultsController = aFetchedResultsController; NSError *error = nil; if (![self.fetchedResultsController performFetch:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return _fetchedResultsController; } 

 - (void) searchBarSearchButtonClicked:(UISearchBar *)theSearchBar { if (self.searchBar.text !=nil) { NSPredicate *predicate =[NSPredicate predicateWithFormat:@"ref CONTAINS[cd] %@", self.searchBar.text]; [self.fetchedResultsController.fetchRequest setPredicate:predicate]; } else { NSPredicate *predicate =[NSPredicate predicateWithFormat:@"All"]; [self.fetchedResultsController.fetchRequest setPredicate:predicate]; } NSError *error = nil; if (![[self fetchedResultsController] performFetch:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); exit(-1); } [self.searchBar resignFirstResponder]; [self.tableView reloadData]; } 

我试图search使用此代码,但searchBarSearchButtonClicked:内的searchBarSearchButtonClicked:不工作我放置一个断点所有代码执行,但没有任何反应。

不知道是什么[NSPredicate predicateWithFormat:@"All"]; 应该这样做,但它不太可能工作。 当您的search文本更改时,应更换提取请求并将新的提取请求添加到FRC。 从FRC文档:

initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:

重要提示:调用此方法后,您不得修改fetchRequest。 例如,你不能改变它的谓词或sorting顺序。

您的其他问题是FRC正在使用caching。 不支持在使​​用caching时更改提取请求。 一般的build议是不使用caching。 如果由于某种原因必须使用caching,那么在(更改)获取请求之前,还需要删除旧的caching- deleteCacheWithName:)

请参阅此处的FRC文档。