如何处理与NSFetchedResultsController的关系?

时间:2014-05-13 02:04:00

标签: ios core-data

核心数据已经为我处理了这种关系,我是否需要构建一个新的查询才能使用NSFetchedResultsController?

我有"专辑"包含"照片"。

Album *anAlbum = [...getalbum...];
* cellForItemAtIndexPath中的

:我想做点什么:

anAlbum.photos

但是,我无法将indexPath转换为NSSet成员索引。 (显然)

没有核心数据我通常只会自己生成所需的查询。我想使用核心数据(显然,再次)。

2 个答案:

答案 0 :(得分:0)

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

如果您需要NSMutableArray,显然可以使用NSMutableArray,但尝试单独访问NSSet项是一件痛苦的事情,因为您必须枚举它们以找到您正在寻找的内容。只需创建一个数组。以下是我完成此操作的示例:

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

然后,您只需使用:

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

这样的事情。

答案 1 :(得分:0)

  

"照片"实体(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的主要概念。