首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复杂对象上的自定义NSSortDescriptor

复杂对象上的自定义NSSortDescriptor
EN

Stack Overflow用户
提问于 2012-06-25 08:32:01
回答 1查看 2K关注 0票数 3

这是我的第一篇文章,如果我不能遵守所有的约定,那么很抱歉,尽管我会尽我最大的努力。我以前总是能找到问题的解决方案,但我完全被一个相当复杂的可可问题困住了。

我正在尝试实现对CoreData对象列表的复杂排序。我有一个由Book对象组成的目录,它可以是Saga (第一本书及其续集)的一部分。简化后的结构如下所示:

代码语言:javascript
复制
@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数据库执行查询,在书本上:

代码语言:javascript
复制
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:context];

我需要三个步骤的排序:

1)按图书的类型排序(不包含在上面的代码中,因为不需要它),其执行方式为:

代码语言:javascript
复制
NSSortDescriptor* mainSort = [[NSSortDescriptor alloc] initWithKey:@"ofGenre.title" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];

2)如果书是传奇的一部分,则按传奇标题排序

代码语言:javascript
复制
NSSortDescriptor* secondarySort = [[SagaTitleSortDescriptor alloc] initWithKey:@"fromSaga" ascending:YES];

其中,自定义排序描述符通过以下方式定义:

代码语言:javascript
复制
#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的一部分,则按卷号排序,否则按书名排序。这就是我的问题,因为我不知道发送什么密钥,也不知道在我的描述符中放什么(我甚至不确定这是不可能的)。

代码语言:javascript
复制
NSSortDescriptor* thirdSort = [[SagaTomaisonOrBookTitleSortDescriptor alloc] initWithKey:@"self" ascending:YES];  

到目前为止,我发现@"self“允许发送被查询的对象,但它似乎不允许查询发送的对象中的参数。作为参考,这里有一些我尝试过的代码:

代码语言:javascript
复制
- (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]];
}

你知道我能做什么也应该做什么吗?

谢谢!

编辑:最后一行有一个类型

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-25 09:05:09

如果您没有使用基于SQL的存储,则可以通过将self作为键传递并将compare:作为选择器来实现,然后实现自定义选择器。也就是说,在图书类上创建一个名为compare的方法:让它完成所有逻辑,而不是使用多个排序描述符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11182297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档