我以文档描述的方式使用NSFetchedResultsController几乎是开箱即用的。这是我的代码的摘录。
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SomeEntity"
inManagedObjectContext:moc];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
NSPredicate *somePredicate = [NSPredicate predicateWithFormat:@"ANY buckets.name == %@", bucketId];
[fetchRequest setPredicate:somePredicate];
frc = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:moc
sectionNameKeyPath:@"titleAccessor"
cacheName:@"frc"];
[fetchRequest release];
注意两点:
1)谓词。在我的数据模型中, SomeEntity 和存储桶具有多对多关系。谓词表示“返回其相关存储桶对象具有此名称的所有 SomeEntity 对象”。按预期工作。
2) 我正在使用 sectionNameKeyPath。它实际上是模型对象中的一个方法,根据一些应用逻辑进行一些计算并返回标题。按预期工作。
现在,问题:
如何连接这两件事并使“titleAccessor”方法知道谓词?我希望部分标题根据谓词而有所不同(准确地说,取决于我在谓词中使用的 bucketId)。说清楚:
现在 titleAccessor 的工作原理是:
return @"result of some calculation"
我想让它这样工作:
if (bucketId == a):
return @"aPrefix" + @"result of some calculation"
else if (bucketId == b):
return @"bPrefix" + @"result of some calculation"
我有两个思路:1)如果这是一个普通的 CD 获取(如果有这样的事情),我可以设置模型对象的一些 volatile 属性并使用它。但是,我无权访问 NSFetchedResultsController 结果对象。2) 如果这是 SQL,我会执行类似“从 blah 中选择 a、b、c 作为“某事”;' 在运行时,“c”将是所需的值,然后我可以将其用作属性。但是,这不是 SQL。:)
如何完成上述所需的行为?
更新:
当然,您在发布问题后立即自己找出答案。(我想张贴是治疗的一部分。)我刚刚意识到我将以下内容放在我的 tableviewcontroller 代表中,正如文档所述:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[frc sections] objectAtIndex:section];
return [sectionInfo name];
}
我可以在这里做必要的修改。这是最好的方法吗?说“是”并提出一些简单的观点。:) (或提出更好的方法。)