2012-03-28 46 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