我可以将实例变量与NSManagedObject一起使用吗?

时间:2010-09-29 23:45:28

标签: iphone objective-c cocoa-touch core-data ios

所以我得到了实体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的子类,那么这可能和/或明智吗?

1 个答案:

答案 0 :(得分:0)

我不会。 NSManagedObjects是数据库中记录的反映,并且在模型外部添加其他成员变量会让我觉得添加了不属于的内容。

还有其他更好的方法来完成同样的事情。最简单的方法是让控制器或委托获取所有这些对象,以便在本地获取,排序和保留数组。

对于大型或复杂情况,您可以根据需要使用NSFetchRequestController收集,排序和分发NSManagedObjects。这很好地集成到UITableViewController。我没有进行过任何性能测试,但是对于可能存在大量记录的情况,我会先尝试一下,看看Fetch Results类是否拥有缓存管理就足够了。