2009-12-16 68 views
0

我有一些NSManagedObjects,我想編寫方法來排序和比較它們的屬性。用分類比較方法裝飾核心數據

我的問題是,由於Core Data將屬性定義爲@dynamic,因此無法在編譯時引用它們。這意味着,裝飾的NSManagedObject用這樣的方法:

- (NSComparisonResult) compareDateAndTime:(Event *) event { 
    return [originDate compare:[event originDate]]; 
} 

會導致編譯器不能夠找到一個名爲「originDate」屬性。 上述方法被稱爲像這樣:

NSArray *events = [[NSArray alloc] 
     initWithArray:[unsortedEvents sortedArrayUsingSelector:@selector(compareDateAndTime:)]]; 

我可以斷言或fetchedResultController去,但我想建立這些作爲 方法我自己,因爲我對每個NSManagedObject相同NSObjects。這個NSObject充當一個臨時對象,它在NSManagedObject上設置屬性然後持久化之前傳遞並填充。我還有一些其他功能,如專門的訪問器,我想添加到NSManagedObject。 (1)**是否有一種通用/最佳實踐的方式來裝飾NSManagedObjects的方法和函數**(2)**並讓Xcode在「重新構建」一個實體的類時不覆蓋它們?

謝謝你的任何幫助或「RTFM」給出:)

+0

我回答了您的問題(1和2),但我同意弗蘭克的看法,我不明白您最初描述的「問題」。編譯器應該允許你使用聲明的屬性。你是否包含爲實體生成的類的頭部? – gerry3 2009-12-17 00:36:45

回答

2

我重新生成模型類爲我的實體相當頻繁,所以我增加了支持的方法(包括吸氣瞬態特性的實現)作爲「支持「模型類的類別。

我不需要修改模型類文件,也不會無意中覆蓋其他方法。

例如,「Place」實體可能具有名稱字符串和經度/緯度數字。它也可能具有該名稱的第一個字母的暫時屬性。這可以用作大型表視圖中節索引標題的節名稱鍵路徑。

Xcode中會產生這樣的 「地方」 的實體類文件:

Place.h:

#import <CoreData/CoreData.h> 

@interface Place : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSString * placeName; 
@property (nonatomic, retain) NSNumber * latitude; 
@property (nonatomic, retain) NSNumber * longitude; 

@end 

Place.m:

#import "Place.h" 

@implementation Place 

@dynamic placeName; 
@dynamic latitude; 
@dynamic longitude; 

@end 

我在「地點」類上創建一個「支持」類別。

PlaceSupport.h

@interface Place (Support) 

- (NSString *)uppercaseFirstLetterOfName; 
- (CLLocation*)location; 

@end 

,並實現它在PlaceSupport.m

+0

非常感謝Gerry! 我的臉紅了......我無法擺脫編譯器的錯誤,所以我最終刪除了我的ManagedObjects,重新構建它們,關閉並重新啓動Xcode,並突然沒有訪問屬性的問題。 (現在我知道爲什麼我無法在谷歌或我的Objective C書中找到它,這沒有問題)。 我真的很喜歡Category解決方案,我在Objective C中不是很有經驗,並且忘記了子類化並不總是必需的。至少有什麼好東西來自我的問題:) – RickiG 2009-12-17 01:58:09

0

你可以使用objectForKey:

另一方面,我沒有直接在我的代碼中使用屬性的問題。

+0

你是對的坦率,我只是遇到了一些奇怪的Xcode的行爲,並沒有經驗,發現有沒有proplem :) – RickiG 2009-12-17 01:59:03