Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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/0/xml/15.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_Sorting_Nsstring_Nsfetchedresultscontroller_Nssortdescriptor - Fatal编程技术网

Ios 具有任意排序的NSSortDescriptor

Ios 具有任意排序的NSSortDescriptor,ios,sorting,nsstring,nsfetchedresultscontroller,nssortdescriptor,Ios,Sorting,Nsstring,Nsfetchedresultscontroller,Nssortdescriptor,我不知道如何使用NSSortDescriptor进行任意排序 我想这样做: NSArray *sortAlgorithm = [NSArray arrayWithObjects:@"@", @"#", @"!", @"&", @"r", @"a", nil]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name"

我不知道如何使用NSSortDescriptor进行任意排序

我想这样做:

NSArray *sortAlgorithm = [NSArray arrayWithObjects:@"@", @"#", @"!", @"&", @"r", @"a", nil];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" 
                                                               ascending:YES 
                                                              comparator:
    ^(id obj1, id obj2) {
        NSComparisonResult comparisonResult;
        //Some code that uses sortAlgorithm.
        return comparisonResult;
    }
];
这将按键
名称对对象进行排序,这样以
开头的任何键(例如
@home
)都将位于以
r
开头的任何键(例如
部首
)之前,并且该键也将位于以
a
开头的任何键(例如
任何东西
)之前

以上只是一个例子。关键是启用完全任意的排序

这将用于NSFetchedResultsController

//使用sortAlgorithm的代码是什么样子的

编辑:

关于我尝试实现sortDescriptor的代码,如pr.occulus'建议:

- (NSFetchedResultsController *)fetchedResultsController {
    if (__fetchedResultsController)
        return __fetchedResultsController;

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    fetchRequest.entity = [NSEntityDescription entityForName:@"Tag" inManagedObjectContext:self.temporaryManagedObjectContext];

    //NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO comparator:^(id obj1, id obj2) {

        NSArray *sortAlgorithm = [NSArray arrayWithObjects:@"#", @"!", @"@", @".", nil];

        NSString *obj1FirstChar = [(NSString *)obj1 substringToIndex:1];
        NSString *obj2FirstChar = [(NSString *)obj2 substringToIndex:1];
        int idx1 = [sortAlgorithm indexOfObject:obj1FirstChar];
        int idx2 = [sortAlgorithm indexOfObject:obj2FirstChar];

        if ( idx1 < idx2 )
            return NSOrderedAscending;
        else if ( idx1 > idx2 )
            return NSOrderedDescending;
        else
            return NSOrderedSame;
    }];

    fetchRequest.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    fetchRequest.fetchBatchSize = 20;        

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.temporaryManagedObjectContext sectionNameKeyPath:nil cacheName:@"Tags"];

    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    [self.fetchedResultsController performFetch:nil];

    return __fetchedResultsController;
}
-(NSFetchedResultsController*)fetchedResultsController{
if(u fetchedResultsController)
返回uu fetchedResultsController;
NSFetchRequest*fetchRequest=[[NSFetchRequest alloc]init];
fetchRequest.entity=[NSEntityDescription entityForName:@“Tag”inManagedObjectContext:self.temporaryManagedObjectContext];
//NSSortDescriptor*sortDescriptor=[[NSSortDescriptor alloc]initWithKey:@“name”升序:否];
NSSortDescriptor*sortDescriptor=[[NSSortDescriptor alloc]initWithKey:@“name”升序:无比较器:^(id obj1,id obj2){
NSArray*sortAlgorithm=[NSArray数组及其对象:@“#“,@”!,@“,@“,@.”,无];
NSString*obj1FirstChar=[(NSString*)obj1子字符串到索引:1];
NSString*obj2FirstChar=[(NSString*)obj2 substringToIndex:1];
int idx1=[sortAlgorithm indexOfObject:obj1FirstChar];
int idx2=[sortAlgorithm indexOfObject:obj2FirstChar];
if(idx1idx2)
退而求其次;
其他的
返回指定名称;
}];
fetchRequest.sortDescriptors=[NSArray arrayWithObject:sortDescriptor];
fetchRequest.fetchBatchSize=20;
NSFetchedResultsController*aFetchedResultsController=[[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:self.temporaryManagedObjectContext sectionNameKeyPath:nil cacheName:@“Tags”];
aFetchedResultsController.delegate=self;
self.fetchedResultsController=aFetchedResultsController;
[self.fetchedResultsController性能蚀刻:nil];
返回uu fetchedResultsController;
}
注释掉的sortDescriptor工作正常


在实体“Tag”的对象上肯定有一个名为
name
的属性。但即使没有,这似乎也不是问题所在。Xcode似乎甚至没有编译那行代码(sortDescriptor),这听起来很可笑。断点工作正常,但在特定的代码行上没有中断。

您需要将
obj1
obj2
字符串的第一个字符提取为
NSStrings
,在任意排序数组中找到它们的索引,然后比较位置

类似这样:(将此代码放入
^
块)

NSString*obj1FirstChar=[(NSString*)obj1 substringToIndex:1];
NSString*obj2FirstChar=[(NSString*)obj2 substringToIndex:1];
int idx1=[sortAlgorithm indexOfObject:obj1FirstChar];
int idx2=[sortAlgorithm indexOfObject:obj2FirstChar];
//注:我们尚未处理以下情况:
//在字符数组中未找到字符。策略
//因为这需要决定。
if(idx1==idx2){
返回指定名称;
}
if(idx1
未测试,可能需要稍微调整。注意大小写字符的差异


更新:使用自定义排序描述符和SQL支持的核心数据存储似乎存在问题。有关更多信息,请参阅。

我实现了您的建议,为了测试,我将源代码限制为仅包含sortAlgorithm数组中的字符。绝对什么也没发生。甚至比我预期的更糟的是:我在NSSortDescriptor的定义上设置了一个断点,它从不中断。如果我在指令之前或之后设置断点,它将中断。Xcode很简单,非常不方便跳过我测试您的解决方案的尝试。。。我想我会在解决这个新问题时发表这篇评论,以防别人知道。我相信我上面给出的算法是正确的。正如您所注意到的,它甚至没有被使用/调用都可能有问题。您可以发布您实际请求排序的代码吗?i、 e.将NSSortDescriptor放置到何处使用。听起来好像从未使用过排序描述符。您的对象上是否确实有一个名为“name”且类型为NSString*的属性?用代码更新了问题。是的,您的代码看起来不错,但似乎没有使用排序描述符。嗨,斯蒂安,使用核心数据和自定义排序描述符似乎存在已知的错误。为了反映这一点,我更新了上面的答案,见最后一点。最近遇到了同样的问题。我最终接受了唐的理论:
NSString *obj1FirstChar = [(NSString *)obj1 substringToIndex:1];
NSString *obj2FirstChar = [(NSString *)obj2 substringToIndex:1];
int idx1 = [sortAlgorithm indexOfObject:obj1FirstChar];
int idx2 = [sortAlgorithm indexOfObject:obj2FirstChar];

// NOTE: we haven't dealt with the case where one of the
// chars wasn't found in the array of characters. A strategy
// for this would need to be decided.

if (idx1 == idx2) {
    return NSOrderedSame;
}
if (idx1 < idx2) {
    return NSOrderedAscending;
}
return NSOrderedDescending;