2014-05-13 130 views
0

核心数据已经处理了我的关系,我是否需要构建一个新的查询来使用NSFetchedResultsController?如何处理与NSFetchedResultsController的关系?

我有包含“照片”的“相册”。

Album *anAlbum = [...getalbum...]; 
在* cellForItemAtIndexPath

:我想做点什么:

anAlbum.photos 

但是,我不能indexPath转换为NSSet中成员索引。 (显然)

没有核心数据我通常只生成自己需要的查询。我想利用核心数据(显然,也是)。

+0

你想展示什么?照片或相册? –

+0

“照片”实体(anAlbum.photos是关系)包含资产网址。我对显示没有任何问题,我更关心如何使用NSFectchedResultsController的NSSet(核心数据关系) - 或直接使用视图(collection/table)。 – chrisp

回答

0

“Photo”实体(anAlbum.photos是关系)包含 资产网址。我对显示没有任何问题,它更像是关于如何使用NSSet(核心数据关系)与 NSFectchedResultsController - 或直接与视图 (集合/表格)关联的 。

首先,我会用这个NSFetchedResultsController。该组件与表结合使用,并允许以延迟加载的方式加载数据。 其次,我将使用的提取请求应针对Photo实体运行,而不是针对Album运行。换句话说,您应该选择属于特定专辑的所有照片。

这里的代码,我会用...

- (NSFetchedResultsController *)fetchedResultsController { 

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

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

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"album == %@", anAlbum]; 
    [request setPredicate:predicate]; 

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

    [fetchRequest setFetchBatchSize:20]; 

    NSFetchedResultsController *theFetchedResultsController = 
     [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
      managedObjectContext:managedObjectContext sectionNameKeyPath:nil 
      cacheName:nil]; 
    self.fetchedResultsController = theFetchedResultsController; 

    return _fetchedResultsController; 

} 

所以现在你tableView:cellForRowAtIndexPath:你可以使用

Photo *photo = [_fetchedResultsController objectAtIndexPath:indexPath]; 
// access the album the photo belongs to 
Album* album = photo.album; 

您可以在Core Data Tutorial for iOS: How To Use NSFetchedResultsController把握NSFetchedResultsController的主要概念。

0

通常,您将要将该集合转换为NSArray(可能包含NSSet的allobjects),并可能对其进行分类或使用NSSortDescriptor或NSPredicate或两者进行过滤。然后,您可以使用索引路径部分/行通过索引访问数组。

如果这是您所需要的,您可以明显使用NSMutableArray,但尝试单独访问NSSet项目是一件痛苦的事情,因为您基本上必须枚举它们以找到您要查找的内容。只需创建一个数组。此处,我已经做了这样一个例子:

NSArray *tableViewData = [NSArray arrayWithArray:[album.photos allObjects]]; 

然后你只需要访问tableViewData使用对象:

UIImage *obj = UIImageJPEGRepresentation([tableViewData objectAtIndex:indexPath.row], 0.50f); 

类似的东西。

+0

我曾考虑过这个问题。我参加了CS193P演示,Paul Haggerty确实只是从头开始构建NSFetchedResultsController--因为他没有使用数据模型中的“Photographer.photos”关系。这是抛弃我的东西。 – chrisp

+0

不确定我是否理解,但是如果您执行没有谓词的提取,您将获得模型中的所有数据;所以,通常情况下,您将使用谓词来过滤抓取。但是,谓词可以过滤模型中的任何字段。主要的一点是,一旦你做了你的提取,你可以通过使用上面指出的方法访问任何实体来获取提取结果。对不起,我不熟悉CS193P。在实践中,你通常会有一个“助手”类来构建抓取结果控制器并处理基本操作。在我的例子中,它会获取目标的父项。 – RegularExpression

+0

我的意思是...你已经有了“album.photos” - 为什么我需要为同一个数据集建立一个新的查询? – chrisp

相关问题