NSFetchedResultsController导致iPhone 3G冻结

时间:2011-03-30 14:22:26

标签: iphone objective-c core-data ios4

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

1 个答案:

答案 0 :(得分:0)

似乎对模型进行非规范化解决了这个问题。

对于老一代设备,不会再为父实体执行ManagedObjects。