所以我得到了实体Level和Tile。 Level与Tile有很多关系。 Tile有一个属性'index'。
现在我正在使用此代码来获取Level排序的tile数组:
- (NSArray *)sortedTiles
{
NSMutableArray *sortedTiles = [NSMutableArray arrayWithArray:[self.tiles allObjects]];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"index" ascending:YES];
[sortedTiles sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
return sortedTiles;
}
这有效,但我希望能够检索具有特定索引的单个Tile,所以我在Level.h中编写了这个方法:
- (Tile *)tileWithIndex:(NSInteger)index;
实施非常简单:
- (Tile *)tileWithIndex:(NSInteger)index
{
NSArray *sortedTiles = [self sortedTiles];
Tile *tile = [sortedTiles objectAtIndex:index];
return tile;
}
现在,当然这不是最有效的方法,因为每次都必须分配和排序切片数组,所以我在想:如果我只是将一个实例变量添加到Level,'sortedTiles',那么我不必每次都重建它。但是Level是NSManagedObject的子类,那么这可能和/或明智吗?
答案 0 :(得分:0)
我不会。 NSManagedObjects是数据库中记录的反映,并且在模型外部添加其他成员变量会让我觉得添加了不属于的内容。
还有其他更好的方法来完成同样的事情。最简单的方法是让控制器或委托获取所有这些对象,以便在本地获取,排序和保留数组。
对于大型或复杂情况,您可以根据需要使用NSFetchRequestController
收集,排序和分发NSManagedObjects
。这很好地集成到UITableViewController
。我没有进行过任何性能测试,但是对于可能存在大量记录的情况,我会先尝试一下,看看Fetch Results类是否拥有缓存管理就足够了。