2011-03-30 122 views
1

我有一个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); 
    } 
} 

回答

0

似乎反规范化模型解决了这个问题。

对于旧版设备,不会再为父实体做ManagedObjects。