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

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



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

同样,使用Momento作为设计模式。在Flickr上使用link to a screenshot(因为我是菜鸟,所以stackOverflow不会让我发布图像。)

也许我以前的RDBMS东西正在污染我的思想,但是他们没有进行mongo-join来获得正确的价值,对吗? [标签,事件,人,位置]。我必须看不到一种更优雅的方式。

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

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

在此先感谢您的帮助。

最佳答案

如果您将索引卡与标签(或其他)建立一对多关系,则访存的索引卡对象应具有标签的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(当然,在使用表视图时,您应该使用nsfetchedresultscontroller,因为它会在滚动表时动态获取所需的IndexCard)。此代码假设我们在其范围内有一个可用的NSManagedObjectContext(理想情况是从AppDelegate传入并设置为ivar),并且我们的IndexCard对象具有某种可以通过其搜索的key / 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可以关联的对象类型有限。如果类型可以随机更改和增加,则需要对此方法进行修改。

希望这会有所帮助。

关于ios - Momento和“一对多”:CoreData方法,设计注意事项和意见,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10556334/

10-10 20:39