2

使用 Indexcard 隐喻的给定和基于核心数据的应用程序。每个索引卡可以选择与许多其他实体/表建立一对多的关系;即,我将使用 Momento 的“Moment”作为我的 Indexcard 对象和 Momento 的标签、位置等辅助工具的代理,用于这些其他对象/表格。

显示这些外部表关系是否存在于整个应用程序中可能最重要的 tableView 上的“最快”方法是什么?

布置单元格部分以显示关系是否存在以及每种关系类型的计数的最佳方法是什么?

同样,使用 Momento 作为设计模式。带有指向 Flickr上的屏幕截图的链接(因为 stackOverflow 不允许我发布图片,因为我是菜鸟。)

也许我的前 RDBMS 东西正在污染我的思想,但他们没有做一个 mongo-join 来使值正确,不是吗?[标签、事件、人物、地点]。必须有一种更优雅的方式,我只是没有看到。

我在右侧布置单元格的想法是,如果“是”放置图标和计数,则可能使用一些布尔值,但这对于每个单元格来说似乎都相当昂贵。

我确信这个布局问题的答案将由问题第一部分中采用的方法驱动。出于维护原因,我似乎不想将辅助关系存储在“主要/时刻”IndexCard 对象中。

提前感谢您的帮助。

4

1 回答 1

1

如果您设置索引卡与标签(或其他)的一对多关系,则获取的索引卡对象应该具有标签的 NSSet 作为属性。其他人也一样,您应该能够获取集合的计数并将其显示在每个适当的图标旁边。

..除非我误解了你的问题。

编辑:要回答第二部分,您确实应该在 cellForRowAtIndex 路径中有一个条件来检查每个集合的计数,或者只用图标显示它(然后可能有 0,这通常很好),或者检查它是否是0 并隐藏图像,如果它是你说的。我认为这两种解决方案都不会减慢您的应用程序的速度,因为在呈现单元格时无论如何都已经获取了数据,但是您直接通过计数而不检查它是否为 0 的解决方案通常总体上会很快.

编辑以提供一些示例代码: 您的核心数据模型将有一个 IndexCard 实体,然后为每种类型的可能相关对象提供一个实体。

1)型号:

IndexCard - 与每个其他实体具有一对多的关系

标签

地点

2)创建此模型和相应的 Object 类后,您将得到一个 IndexCard 类,其标题中包含以下内容

@property (nonatomic, strong) NSSet *tags
@property (nonatomic, strong) NSSet *locations
@property (nonatomic, strong) NSSet *people

当然还有以下实现

@dynamic tags
@dynamic locations
@dynamic people

3)现在我们已经建立了这个核心数据模型,我们可以执行一个nsfetchrequest(当然,当使用一个tableview时,你应该使用一个nsfetchedresultscontroller,因为它会在你滚动表格时动态地获取它需要的IndexCards)。此代码假定我们在其范围内有一个可用的 NSManagedObjectContext(理想情况下是从 AppDelegate 传入并设置为 ivar),并且我们的 IndexCard 对象具有某种我们可以搜索的键/id 属性,我们称之为“数字”

NSNumber *numberWeWant = [NSNumber numberWithInt:1];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"IndexCard" inManagedObjectContext:ourContext];
request.predicate = [NSPredicate predicateWithFormat:@"number == %@", numberWeWant];

NSError *error = nil;

NSArray *results = [context executeFetchRequest:request error:&error];

//didn't bother error checking in case no IndexCard matches
IndexCard *ourCard = [results lastObject];

//you can now use these to display in the cell or hide the appropriate icons if they = 0
int numTags = ourCard.tags.count;
int numLocations = ourCard.locations.count;
int numPeople = ourCard.people.count;

//just a sample of how we would access the individual related objects
for(Tag *tag in ourCard.tags)
{
    //do whatever you want with each tag here
}

同样,此代码仅用于获取单个 IndexCard。在实际表中,您将在加载包含它的视图时初始化 nsfetchedresultscontroller,然后仅在 cellForRowAtIndexPath 中与 IndexPath.row 匹配的位置访问 IndexCard。

这也假设 IndexCard 可以关联的对象类型有限。如果类型可以随机更改和增加,则需要修改此方法。

希望这会有所帮助。

于 2012-05-11T18:11:29.327 回答