核心数据使用排序比较方法进行装饰

时间:2009-12-16 23:37:12

标签: iphone objective-c core-data

我有一些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都有相同的NSObject。这个NSObject充当一个临时对象,它在NSManagedObject上设置属性然后被持久化之前传递并填充。我还有一些其他功能,比如专门的访问器,我想添加到NSManagedObject。

**(1)**是否有一种通用/最佳实践方法用方法和函数装饰NSManagedObjects **(2)**并且当“重建”实体的类时Xcode不会覆盖它们?

感谢您提供任何帮助或“RTFM”:)

2 个答案:

答案 0 :(得分:2)

我经常为我的实体重新生成模型类,所以我在模型类中添加了支持方法(包括瞬态属性的getter实现)作为“支持”类别。

我不需要修改模型类文件,也不可能无意中覆盖我的其他方法。

例如,“Place”实体可能具有名称字符串和纬度/经度数字。它也可能具有名称第一个字母的瞬态属性。这可以用作大表视图中节索引标题的节名称键路径。

Xcode将生成“Place”实体的类文件,如下所示:

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

中实施

答案 1 :(得分:0)

您可以使用objectForKey:吗?

另一方面,我在代码中直接使用属性没有问题。