这是我的第一篇文章,如果我可能不遵守所有惯例,即使我会尽力而为,我深表歉意。我之前一直在 SO 上找到解决问题的方法,但我完全陷入了一个相当复杂的 Cocoa 问题。
我正在尝试对 CoreData 对象列表进行复杂排序。我有一个由 Book 对象组成的目录,它可以是 Saga 的一部分(第一本书及其续集)。简化的结构如下所示:
@interface Book : NSManagedObject
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSNumber * tomaison; //volume numbering
@property (nonatomic, retain) Saga *fromSaga;
@interface Saga : NSManagedObject
@property (nonatomic, retain) NSString * title;
我正在尝试在 Book 上对我的 CoreData 数据库执行查询:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:context];
我需要分三个步骤进行排序:
1)按书籍的流派排序(不包含在上面的代码中,因为它不需要),执行如下:
NSSortDescriptor* mainSort = [[NSSortDescriptor alloc] initWithKey:@"ofGenre.title" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
2) 如果书是 Saga 的一部分,则按 Saga 标题排序
NSSortDescriptor* secondarySort = [[SagaTitleSortDescriptor alloc] initWithKey:@"fromSaga" ascending:YES];
自定义排序描述符由以下内容定义:
#define NULL_OBJECT(a) ((a) == nil || [(a) isEqual:[NSNull null]])
@interface SagaTitleSortDescriptor : NSSortDescriptor {}
@end
@implementation SagaTitleSortDescriptor
- (id)copyWithZone:(NSZone*)zone
{
return [[[self class] alloc] initWithKey:[self key] ascending:[self ascending] selector:[self selector]];
}
- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2
{
if (NULL_OBJECT([object1 valueForKeyPath:[self key]])) {
if (NULL_OBJECT([object2 valueForKeyPath:[self key]]))
return NSOrderedSame;
return NSOrderedDescending;
}
if (NULL_OBJECT([object2 valueForKeyPath:[self key]])) {
return NSOrderedAscending;
}
return [super compareObject:[(Saga*)object1 title] toObject:[(Saga*)object2 title]];
}
@end
3) 如果它是 Saga 的一部分,则按卷编号排序,否则,按书名排序。这是我的问题,因为我不知道要发送什么密钥以及要在我的描述符中放入什么(我什至不确定这是否可能)。
NSSortDescriptor* thirdSort = [[SagaTomaisonOrBookTitleSortDescriptor alloc] initWithKey:@"self" ascending:YES];
到目前为止,我发现 @"self" 允许发送被查询的对象,但它似乎不允许在发送的对象中查询参数。作为参考,我尝试了一些代码:
- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2
{
if (NULL_OBJECT([(Book*)object1 fromSaga]) && NULL_OBJECT([(Book*)object2 fromSaga])) {
return [super compareObject:[(Book*)object1 title] toObject:[(Book*)object2 title]];
}
if (NULL_OBJECT([(Book*)object1 fromSaga])) {
return NSOrderedDescending;
}
if (NULL_OBJECT([(Book*)object2 fromSaga])) {
return NSOrderedAscending;
}
return [super compareObject:[(Book*)object1 tomaison] toObject:[(Book*)object1 tomaison]];
}
知道我能做什么和应该做什么吗?
谢谢 !
编辑:最后一行有一个类型