在复杂对象上定制NSSortDescriptor

这是我的第一篇文章,如果我不尊重所有的惯例,尽pipe我会尽我所能。 我总是find解决我的问题的方法,但是我完全停留在一个相当复杂的cocoa问题上。

我想在CoreData对象的列表上实现一个复杂的sorting。 我有一个由Book对象组成的目录,它可以是佐贺(第一本书及其续集)的一部分。 简化的结构如下所示:

@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; 

我正试图在我的CoreData数据库,在书上执行一个查询:

 NSEntityDescription *entity = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:context]; 

我需要三个步骤来sorting:

1)根据本书的stream派(不包括在上面的代码中,因为它不需要)

 NSSortDescriptor* mainSort = [[NSSortDescriptor alloc] initWithKey:@"ofGenre.title" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; 

2)如果图书是佐贺的一部分,按佐贺标题sorting

 NSSortDescriptor* secondarySort = [[SagaTitleSortDescriptor alloc] initWithKey:@"fromSaga" ascending:YES]; 

自定义sorting描述符定义如下:

 #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)按卷号sorting如果它是佐贺的一部分,否则按书名sorting。 这是我的问题,因为我不知道发送什么密钥,以及在我的描述符中放什么(我甚至不确定这是可能的)。

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

任何想法我能做什么,应该做什么?

谢谢 !

编辑:在最后一行有一个types

如果不使用基于SQL的存储,则可以通过将self作为关键字进行比较:作为select器,然后实现该自定义select器。 也就是说,在您的book类中创build一个名为compare的方法,只需要它执行所有的逻辑而不是使用多个sorting描述符。