首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >任意排序的NSSortDescriptor

任意排序的NSSortDescriptor
EN

Stack Overflow用户
提问于 2011-11-25 15:11:40
回答 1查看 3.2K关注 0票数 4

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

我想做这样的事:

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

这将按键name对对象进行排序,以便以@ (例如@home )开头的任何键将位于以r (例如radical )开头的任何键之前,而在以a (例如anything )开头的任何键之前。

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

这将用于NSFetchedResultsController。

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

编辑:

围绕着我试图实现sortDescriptor的代码,如pr。occulus'建议:

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

注释掉的sortDescriptor起作用。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-25 15:42:41

您需要将obj1obj2字符串的第一个字符作为NSStrings,在任意排序数组中查找它们的索引,然后比较它们的位置。

如下所示:(将此代码放入您的^块)

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

没有测试,可能需要稍微调整一下。注意大小写字符的差异。

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

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

https://stackoverflow.com/questions/8271008

复制
相关文章

相似问题

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