我有一个UISearchDisplayController,只要更改了searchBar,它就会修改NSFetchRequest的NSPredicate。此获取请求与更新searchResultsTableView的NSFetchedResultsController相关联。
这些工作在iOS设备上顺利工作> = iPhone 3GS,但是一旦searchBar内容稍微改变,通过冻结UI完全无法在iPhone 3G设备上失败。如果持久性商店中没有任何记录,甚至会发生这种情况。
获取实际上是可执行的,因为应用程序因退出(-1)而未退出。
有人看过这样的问题或者想知道如何处理这个问题吗?
(在iOS 4.3SDK上执行此操作,部署目标设置为4.0。有问题的iPhone 3G在OS 4.2.1上。)
创建Search FRC的代码:
-(NSFetchedResultsController *)searchFetchedResultsController {
if (__searchResults) {
return __searchResults;
}
NSFetchRequest *fetchrequest = [[NSFetchRequest alloc] init];
[fetchrequest setEntity:[NSEntityDescription entityForName:@"Product" inManagedObjectContext:[[LBCCacheManager sharedLBCCacheManager] managedObjectContext]]];
[fetchrequest setFetchBatchSize:20];
[fetchrequest setPropertiesToFetch:[NSArray arrayWithObjects:@"title", @"slug", nil]];
NSSortDescriptor *recentSort = [NSSortDescriptor sortDescriptorWithKey:@"dealsCount" ascending:NO];
[fetchrequest setSortDescriptors:[NSArray arrayWithObject:recentSort]];
NSFetchedResultsController *fetchedcontroller = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchrequest
managedObjectContext:[[LBCCacheManager sharedLBCCacheManager] managedObjectContext]
sectionNameKeyPath:nil
cacheName:nil];
fetchedcontroller.delegate = self;
[__searchResults release], __searchResults = nil;
__searchResults = [fetchedcontroller retain];
[fetchedcontroller release];
[fetchrequest release];
return __searchResults;
}
每次更改searchBar时的代码:
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
if ([controller.searchBar.text length] > 0) {
[self contentFilter:controller];
}
return YES;
}
-(void)contentFilter:(UISearchDisplayController *)controller {
[[self searchFetchedResultsController].fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"title contains[c] %@", controller.searchBar.text]];
NSError *error = nil;
if (![[self searchFetchedResultsController] performFetch:&error]) {
NSLog(@"ERROR");
exit(-1);
}
}
答案 0 :(得分:0)
似乎对模型进行非规范化解决了这个问题。
对于老一代设备,不会再为父实体执行ManagedObjects。