【问题标题】:Core Data decorating with sort-compare methods使用排序比较方法进行核心数据装饰
【发布时间】:2010-12-27 11:25:40
【问题描述】:

我有一些 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”:)

【问题讨论】:

  • 我在下面回答了您的问题 (1&2),但我同意弗兰克的观点,即我不理解您最初描述的“问题”。编译器应该允许您使用声明的属性。您是否包括为实体生成的类的标题?

标签: iphone objective-c core-data


【解决方案1】:

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

我不必修改模型类文件,也不会意外覆盖我的其他方法。

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

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

地点.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

中实现它

【讨论】:

  • 非常感谢格里!我的脸红了吗...我无法摆脱编译器的错误,所以我最终删除了我的 ManagedObjects,重新构建它们,关闭并重新启动 Xcode,突然访问属性没有问题。 (现在我知道为什么我在谷歌或我的 Objective C 书中找不到这个,没有问题)。我真的很喜欢 Category 解决方案,我在 Objective C 方面不是很有经验,并且一直忘记子类化并不总是必要的。至少我的问题有一些好处:)
【解决方案2】:

你能用objectForKey:吗?

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

【讨论】:

  • 你说得对,弗兰克,我只是遇到了一些奇怪的 Xcode 行为,没有经验发现没有问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
相关资源
最近更新 更多