ios - 具有任意排序的 NSSortDescriptor

标签 ios sorting nsstring nsfetchedresultscontroller nssortdescriptor

我不知道如何使用 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;
    }
];

这将按键 name 对对象进行排序,以便任何以 @ 开头的键,例如@home,将出现在任何以 r 开头的键之前,例如radical,并且它再次出现在任何以 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;
}

注释掉的 sortDescriptor 有效。

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

最佳答案

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

像这样:(把这段代码放在你的 ^ block 中)

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了解更多信息。

关于ios - 具有任意排序的 NSSortDescriptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8271008/

相关文章:

iphone - UIBezierPath 路径太多 = 太慢?

ios - 为什么这个 NSMutableAttributedString addAttribute 只有在我使用 mutableCopy 时才有效

sorting - 如何(如果可能)在 Rust 中按值对 BTreeMap 进行排序?

C++ 排序和跟踪索引

ios - 如何对NSString中的成分进行排序?例如1/2杯牛奶,1/4勺粉

debugging - NSDictionary 和 NSURL 的 Objective-C 问题

IOS Swift TableView 对索引路径处的行进行编辑操作

ios - Swift TableView in ViewController In Navigation VC in Tab Bar : Cells won't populate with data from list

ios - 访问电池供电的 iBeacon 设备(主要是 kontakt io 设备)的电池电量?

java - 在 Pivot 上对数组进行分区