Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 复杂对象上的自定义NSSortDescriptor_Ios_Cocoa_Core Data_Nssortdescriptor - Fatal编程技术网

Ios 复杂对象上的自定义NSSortDescriptor

Ios 复杂对象上的自定义NSSortDescriptor,ios,cocoa,core-data,nssortdescriptor,Ios,Cocoa,Core Data,Nssortdescriptor,这是我的第一篇帖子,很抱歉,如果我可能不尊重所有的惯例,即使我会尽我最大的努力。我以前总是能找到解决问题的方法,但我完全被困在一个相当复杂的问题上 我正在尝试对CoreData对象列表进行复杂排序。我有一个由书籍对象组成的目录,它可以是传奇(第一本书及其续集)的一部分。简化结构如下所示: @interface Book : NSManagedObject @property (nonatomic, retain) NSString * title; @property (nonatomic, r

这是我的第一篇帖子,很抱歉,如果我可能不尊重所有的惯例,即使我会尽我最大的努力。我以前总是能找到解决问题的方法,但我完全被困在一个相当复杂的问题上

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

@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数据库上执行一个查询,在Book上:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:context];
我需要分三步进行排序:

1) 按书的类型排序(由于不需要,因此不包含在上述代码中),该操作通过以下方式执行:

NSSortDescriptor* mainSort = [[NSSortDescriptor alloc] initWithKey:@"ofGenre.title" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
2) 如果该书是传奇的一部分,则按传奇标题排序

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

到目前为止,我发现@“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]];
}
你知道我能做什么,应该做什么吗

谢谢


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

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

这是NSFetchRequest的一部分吗?您正在使用什么核心数据备份存储?如果是SQL后端,则不能将基于代码的排序描述符用于NSFetchRequest。它确实是NSFetchRequest的一部分,我使用的是标准CoreData模型(.xcdatamodel、NSManagedObjectContext等)。请注意,第二个排序描述符工作得很好。这很有趣。然而,它似乎也不起作用。我已经在我的Book类中实现了一个自定义选择器(在更具体的类别中),它崩溃了。我已经用一些非常简单的测试进行了验证:
-(NSComparisonResult)specialCompare:(id)other{return sensorderedname;}
和在ViewController中:
NSSortDescriptor*thirdSort=[[NSSortDescriptor alloc]initWithKey:@“self”升序:YES选择器:@selector(specialCompare:)]我做错了什么吗?补充说明:我不能简单地覆盖Book.h中的compare:方法,因为这不是我比较两本书的唯一地方,其他地方有其他排序方法,我觉得还可以。车祸发生在哪里?您收到了什么消息?崩溃发生在
[OfftchedResultsController performFetch:nil]期间呼叫。没有消息,不幸的是,无法在自定义NSSortDescriptor中调试(或至少据我所知)、记录或执行任何操作。您是否使用基于SQLLite的备份存储?如果是这样,您应该获取它们(未排序),然后自己对结果数组进行排序。
- (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]];
}