2010-09-29 62 views
0

所以我得到了實體Level和Tile。關卡與Tile具有多對多關係。瓷磚有一個屬性'索引'。我可以在NSManagedObject中使用實例變量嗎?

現在,我使用這個代碼來獲得級別的瓷磚排序的數組:

- (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; 
} 

這工作,但我希望能夠檢索與某個索引單個瓷磚,所以我寫了這種方法在Level.h:

- (Tile *)tileWithIndex:(NSInteger)index; 

實現相當簡單:現在

- (Tile *)tileWithIndex:(NSInteger)index 
{ 
    NSArray *sortedTiles = [self sortedTiles]; 
    Tile *tile = [sortedTiles objectAtIndex:index]; 
    return tile; 
} 

中,當然這並不是最有效的方法,因爲tile數組必須每次分配和排序,所以我在想:如果我只是將一個實例變量添加到Level,'sortedTiles',那麼我不會有每次重建它。但是Level是NSManagedObject的子類,所以這是可能的和/或明智的做法?

+0

請正確格式化您的代碼。 – 2010-09-29 23:49:00

+0

很想去,但不能得到它的工作。我在一些行之前使用4個空格來縮進,但它不會縮進...編輯:對不起,完全誤解了格式引用。固定。 – Rits 2010-09-30 00:10:09

回答

0

我不會。 NSManagedObjects是數據庫中記錄的反映,並且在模型外部添加額外的成員變量會引起我添加不屬於的內容。

還有其他更好的方法來完成同樣的事情。最簡單的方法是獲取控制器或委託來獲取所有這些對象以在本地獲取,排序和保留數組。

對於大型或複雜的情況,您可以根據需要使用NSFetchRequestController來收集,排序並提供NSManagedObjects。這很好地集成到UITableViewController。我沒有做過任何性能測試,但是對於可能有大量記錄的情況,我會首先嚐試查看提取結果類是否擁有緩存管理是足夠的。

+0

我不知道我同意你不應該將iVars添加到一般的NSManagedObject子類中。只要這些iVar不打算持續存在,並且它們的訪問者說明了該實例的isFault狀態,就會有很多有效且良好的用途。至於OP的使用,我不確定我是否完全理解這個問題,但是我「感覺」它是過度的。 :-) – 2010-09-30 16:22:12

+0

你能舉個例子嗎? (1)沒有更好地存儲在控制器或委託管理應用程序,視圖或用例中,並且(2)當多個NSManagedObjectContext每個持有對象的版本。 – 2010-09-30 17:00:05

+0

使用實例變量的主要優點是Level的'tileWithIndex:'方法的優化。現在,每次我調用這個方法時,必須重建sortedTiles。如果我將sortedTiles存儲在Level的一個實例變量中,那麼我可以每次使用該變量。 – Rits 2010-09-30 20:00:34

相關問題