Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.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 未调用NSComparator块_Ios_Objective C Blocks_Nssortdescriptor - Fatal编程技术网

Ios 未调用NSComparator块

Ios 未调用NSComparator块,ios,objective-c-blocks,nssortdescriptor,Ios,Objective C Blocks,Nssortdescriptor,我使用NSFetchRequest从核心数据存储中提取数据,并将数据存储在数组中——所有这些都非常有效。作为下一步,我想使用NSSortDescriptors对数组进行排序,如下所示: array = [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects: [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO],

我使用
NSFetchRequest
核心数据
存储中提取数据,并将数据存储在
数组中
——所有这些都非常有效。作为下一步,我想使用
NSSortDescriptors
数组进行排序,如下所示:

array = [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:
            [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO],
            [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO comparator:^NSComparisonResult(id obj1, id obj2) {
                    if ([[[array objectAtIndex:[obj2 integerValue]] valueForKey:@"lessImportantItems"] containsObject:[array objectAtIndex:[obj1 integerValue]]]) {
                        return (NSComparisonResult)NSOrderedAscending;
                    } else {
                        return (NSComparisonResult)NSOrderedDescending;
                    }
                }],
            [NSSortDescriptor sortDescriptorWithKey:@"createdAt" ascending:NO], nil]];
我遇到的问题是没有调用第二个
nssortddescriptor
中的
NSComparator
块(我尝试
NSLog
)。为了给我的数据结构提供一些背景信息,下面是相关的
核心数据
对象图部分:

应用程序所做的是将项目相互比较。作为第一步,配对比较中的获胜者获得
分数
增量。但我也标记了一个配对优先级,即我添加了一对多
lessImportantItems
从胜利者到失败者的关系。因此,在我的数组中,我首先尝试按
score
排序,然后,当
score
s相等时,我也尝试按成对优先级排序

可能是因为我连续两次使用
score
作为比较器
key
?但是,另一方面,
NSComparator
也不允许将
关系
作为
键传递


我似乎无法破解这个。有人有什么想法吗?或者我应该采取不同的排序方法?

第二个排序描述符对我来说没有任何意义。它适用于给定的比较器 添加到要比较的对象的
得分
属性。所以在比较器内部,
obj1
obj2
是待比较对象的得分值。 似乎您试图使用

[array objectAtIndex:[obj1 integerValue]]
[array objectAtIndex:[obj2 integerValue]]
但这是行不通的。因此,第二个排序描述符应该如下所示

[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO
        comparator:^NSComparisonResult(Item *item1, Item *item2) {

        // compare item1, item2 ...
}];
但接下来的问题是:如何根据优先级比较两个对象? 您的代码基本上执行以下操作:

if ([item2 valueForKey:@"lessImportantItems"] containsObject:item1]) {
    return NSOrderedAscending;
} else {
    return NSOrderedDescending;
}
但这不是一个合适的比较标准:

  • 如果对象相等(非“自反”),则不返回
  • 对于两个“不相关的对象”,它将返回
    sensorderescending
    ,而不考虑 订单(非“不对称”)
  • 它不会检测
    item1
    是否仅与
    item2
    间接相关(不是 “及物性”)
但如何对“无关对象”进行排序?没有唯一的解决方案。如果B和C都是 不如A重要,那么A,B,C和A,C,B都是有效的解决方案。 比较B和C时,比较器应该返回什么

所以我认为用排序描述符和
您必须选择其他算法,例如..

第二个排序描述符对我来说没有任何意义。它适用于给定的比较器 添加到要比较的对象的
得分
属性。所以在比较器内部,
obj1
obj2
是待比较对象的得分值。 似乎您试图使用

[array objectAtIndex:[obj1 integerValue]]
[array objectAtIndex:[obj2 integerValue]]
但这是行不通的。因此,第二个排序描述符应该如下所示

[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO
        comparator:^NSComparisonResult(Item *item1, Item *item2) {

        // compare item1, item2 ...
}];
但接下来的问题是:如何根据优先级比较两个对象? 您的代码基本上执行以下操作:

if ([item2 valueForKey:@"lessImportantItems"] containsObject:item1]) {
    return NSOrderedAscending;
} else {
    return NSOrderedDescending;
}
但这不是一个合适的比较标准:

  • 如果对象相等(非“自反”),则不返回
  • 对于两个“不相关的对象”,它将返回
    sensorderescending
    ,而不考虑 订单(非“不对称”)
  • 它不会检测
    item1
    是否仅与
    item2
    间接相关(不是 “及物性”)
但如何对“无关对象”进行排序?没有唯一的解决方案。如果B和C都是 不如A重要,那么A,B,C和A,C,B都是有效的解决方案。 比较B和C时,比较器应该返回什么

所以我认为用排序描述符和
您必须选择其他算法,例如..

如果有人感兴趣,下面是我如何实现所需排序的

我只使用了上面示例中的第一个
nssortddescriptor
来获得按
分数排序的
数组
,然后我调用了该
数组
的进一步排序方法:

array = [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:
            [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO], nil];

array = [self applyMoreImportantPairOrdering:array];
方法如下:

+ (NSArray *)applyMoreImportantPairOrdering:(NSArray *)array {

    NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:array];

    [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        if ([[obj valueForKey:@"score"] integerValue] > 0) {

            NSMutableSet *lessImportantItemsSet = [NSMutableSet setWithSet:[obj valueForKey:@"lessImportantItems"]];

            for (int i = idx - 1; i >= 0; i--) {

                NSManagedObject *objAbove = [array objectAtIndex:i];

                if ([[obj valueForKey:@"score"] integerValue] == [[objAbove valueForKey:@"score"] integerValue]) {

                    if ([lessImportantItemsSet containsObject:objAbove]) {

                        NSUInteger idxAbove = [mutableArray indexOfObject:objAbove];

                        [mutableArray removeObject:obj];
                        [mutableArray insertObject:obj atIndex:idxAbove];
                    }
                }
            }
        }
    }];

    return [NSArray arrayWithArray:mutableArray];
}

我之所以需要
lessImportantItems集
,是因为当我在
数组
中移动(删除和插入)一个
时,它会丢失它的
lessImportantItems
关系。这样,当我处理完特定的
项目时,我会维护不太重要的
项目的列表/集合

如果有人感兴趣,下面是我如何实现我所追求的排序

我只使用了上面示例中的第一个
nssortddescriptor
来获得按
分数排序的
数组
,然后我调用了该
数组
的进一步排序方法:

array = [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:
            [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO], nil];

array = [self applyMoreImportantPairOrdering:array];
方法如下:

+ (NSArray *)applyMoreImportantPairOrdering:(NSArray *)array {

    NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:array];

    [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        if ([[obj valueForKey:@"score"] integerValue] > 0) {

            NSMutableSet *lessImportantItemsSet = [NSMutableSet setWithSet:[obj valueForKey:@"lessImportantItems"]];

            for (int i = idx - 1; i >= 0; i--) {

                NSManagedObject *objAbove = [array objectAtIndex:i];

                if ([[obj valueForKey:@"score"] integerValue] == [[objAbove valueForKey:@"score"] integerValue]) {

                    if ([lessImportantItemsSet containsObject:objAbove]) {

                        NSUInteger idxAbove = [mutableArray indexOfObject:objAbove];

                        [mutableArray removeObject:obj];
                        [mutableArray insertObject:obj atIndex:idxAbove];
                    }
                }
            }
        }
    }];

    return [NSArray arrayWithArray:mutableArray];
}

我之所以需要
lessImportantItems集
,是因为当我在
数组
中移动(删除和插入)一个
时,它会丢失它的
lessImportantItems
关系。这样,当我处理完特定的
项目时,我会维护不太重要的
项目的列表/集合
s

,所以您想要的最终结果是对项目进行排序?无论如何?或者是你的一个变体?嗯,就像排序描述符所说的:(1)按分数排序,然后(2)如果分数相等,则按更重要的一对一排序,最后(3)按创建的日期排序(实际上与尾部的项目相关,即那些分数相等的项目-尚未比较)。这就是你要问的吗?所以你想要的最终结果是对项目进行排序?无论如何?或者是你的一个变体?就像排序描述符所说的:(1)按分数排序,然后(2)如果分数相等,则按更重要的一对一排序,最后(3)按创建日期排序(实际上,将与尾部的项目相关,即那些具有相同s的项目)