NSFetchResultsController w/ NSPredicate(关系)与基本 NSFetchRequest(包括图片)

Posted

技术标签:

【中文标题】NSFetchResultsController w/ NSPredicate(关系)与基本 NSFetchRequest(包括图片)【英文标题】:NSFetchResultsController w/ NSPredicate (relationship) vs. Basic NSFetchRequest (Pic Included) 【发布时间】:2011-03-16 03:09:16 【问题描述】:

这是我正在讨论的关系的图像:

我将 UIScrollView 设置为水平滚动条,可在 3 个不同的 UIViewController 之间滚动(当然包含 UITableView 和所需的委托方法等)

UIScrollView 中的每个 ViewController 都会加载特定 MyObjectType 的 UITableView。 (例如,ViewController1 加载所有 MyObjects 的表格视图,其中它的 type == MyObjectType.name

这有意义吗?您会注意到我在对象之间设置了反向关系。一个 MyObjectType 可以有多个 MyObject,但一个 MyObject 只能有一个与之关联的 MyObjectType

当我第一次加载一个 UIScrollView viewController 时,我需要确定这个 UITableView 用于什么MyObjectType。我有这个工作正常,我相应地设置了表头。

例如[type valueForKey:@"name"] 其中 typeMyObjectType 的获取结果 NSManagedObject。

问题是我想知道,当我获得 MyObjectType 的 NSManagedObject 时,我是否也无法访问可以用作 UITableView 的 NSSet *array(即[type valueForKey:@"objects"])数据源?如果在我添加删除一个对象之后我保存 managedContext然后我总是[tableView reloadData] ?

我猜这会起作用,只要我不需要 UITableView 内容在添加这种类型的新 MyObject 时动态更改和更新?为此,我们需要一个 NSFetchedResultsController 对吗?

这是我将 ALL MyObject 加载到 UITableView 中的代码(有效):

- (NSFetchedResultsController *)fetchedResultsController 

if (_fetchedResultsController != nil) 
    return _fetchedResultsController;


NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"MyObject" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc] 
                          initWithKey:@"creationDate" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController = 
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                    managedObjectContext:managedObjectContext sectionNameKeyPath:@"transientSectionDate" 
                                               cacheName:@"Root"];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;

[sort release];
[fetchRequest release];
[theFetchedResultsController release];

return _fetchedResultsController;    

能否请人向我展示我需要正确加载的实际 NSPredicate 声明 ONLY MyObject 的 MyObjectType.name = = @“XXXXXX”?假设我已经有一个 MyObjectType.name 存储在 ViewController 内的保留 NSString 中。

提前致谢!

【问题讨论】:

【参考方案1】:

谓词格式字符串为:

@"ALL type.name=%@", typeName

但是,由于您确实有一个特定的 MyObjectType 对象,因此您已经可以直接访问所需的 MyObject 对象,而不必浪费时间尝试获取它们。只需将集合转换为排序数组。

要在表格处于活动状态时随时了解正在进行的更改,请在表格视图数据源对象中实现observeValueForKeyPath:ofObject:change:context:。然后将addObserver:forKeyPath:options:context: 发送到特定的 MyObjectType 对象,如下所示:

[anObjectType addObserver:self 
               forKeyPath:@"objects" 
                  options:(NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld) 
                  context:nil];

现在,每当该特定 MyObjectType 的 objects 值更改时,都会通知 tableview 的数据源并可以更改表。

详情请见Key-Value Observing Programming Guide。

【讨论】:

那么实现 `observerValueForKeyPath:ofObject:change:context: 将确保 MyObjectType 的 NSSet 表数据源在添加新的 MyObject 时自动更新 MyObjectType?这意味着我可以放弃整个 NSFetchedResultsController?

以上是关于NSFetchResultsController w/ NSPredicate(关系)与基本 NSFetchRequest(包括图片)的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSFetchResultsController 时 UICollectionView 滚动不流畅

NSFetchResultsController,将新数据填充到表格视图中

NSFetchResultsController 委托没有被调用

NSFetchResultsController 委托没有被调用

NSFetchResultsController -controllerDidChangeContent: - 尝试使用 userInfo 为单元格创建两个动画

在 NSFetchResultsController 中派生节号