2012-03-28 86 views
0

所以,我对于获取我所有的核心数据实体所调用的设置用于获取实体谓词fetchedResultsController最佳实践

- (NSFetchedResultsController *)fetchedResultsController { 

    if (fetchedResultsController_ != nil) { 
     return fetchedResultsController_; 
    } 

    /* 
    Set up the fetched results controller. 
    */ 
    // Create the fetch request for the entity. 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    // Edit the entity name as appropriate. 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Setting" inManagedObjectContext:self.managedObjectContext_]; 
    [fetchRequest setEntity:entity]; 

    [fetchRequest setReturnsObjectsAsFaults:NO]; 
    [fetchRequest setResultType:NSManagedObjectResultType]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"serviceName" ascending:NO]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext_ sectionNameKeyPath:nil cacheName:nil]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController_ = aFetchedResultsController; 

    [aFetchedResultsController release]; 
    [fetchRequest release]; 

    return fetchedResultsController_; 
} 

我有NSFetchedResultsController *fetchedResultsController一个属性,我一直在使用它therough应用程序被下面的代码通过:

[self.fetchedResultsController_ fetchedObjects] 

的问题是,我想与一个特定的属性,即获取实体:一个谓语:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"settingName", somesettingName]; 
     [fetchRequest setPredicate:predicate]; 

问题是我应该创建一个新的fetchResultsControllerWithServiceName: (NSString *) serviceName还是应该使用现有的方法?最佳做法是什么?

回答

1

它肯定会更快(尽管我不知道有多快)来修改现有的提取请求控制器,而不是每次需要更新谓词时重新创建它。 Apple的文档明确指出:“如果您更改提取请求,则不应使用缓存”,但由于您目前没有使用缓存,因此这不是问题。

因此,您只需更新谓词,在获取的结果控制器上调用performFetch:并响应您收到的委托回调即可。

您可能会发现将此系列调用打包到其自己的方法中很方便,但是当只有谓词发生更改时,您肯定可以避免重新生成整个控制器对象。

+0

那么你是说创建一个方法来设置谓词,然后再次调用performFetch? – xonegirlz 2012-03-28 02:51:49

+0

是的,这应该就够了。 – warrenm 2012-03-28 02:54:28

+0

如果现在我想在调用此函数之后获取未设置谓词的fetchedObjects,该怎么办?我基本上必须重置NSFetchRequest的谓词(self.fetchedResultsController.fetchRequest setPredicate:nil)权限后? – xonegirlz 2012-03-28 04:01:27