NSFetchedResultsController导致iPhone 3G冻结
问题描述:
我有一个UISearchDisplayController,只要searchBar发生变化,它就会修改NSFetchRequest的NSPredicate。该获取请求与更新searchResultsTableView的NSFetchedResultsController关联。NSFetchedResultsController导致iPhone 3G冻结
iOS装置顺利这些工作> = iPhone 3GS,但未能这次得分上通过完全冻结UI一次搜索栏内容即使稍微改变iPhone 3G设备。即使持久性存储没有任何记录,也会发生这种情况。
该提取实际上是可执行的,因为应用程序不会因退出(-1)而退出。
任何人看到这样的问题或有一个想法如何处理这个问题?
创建搜索FRC(iOS上4.3SDK设定在4.0部署目标这样做的iPhone 3G有问题挂在OS 4.2.1。)
代码:
-(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;
}
代码,只要搜索栏改为:
-(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);
}
}
答
似乎反规范化模型解决了这个问题。
对于旧版设备,不会再为父实体做ManagedObjects。