我不知道如何使用 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),这听起来很荒谬。断点工作正常,但不会中断该特定代码行。
最佳答案
你需要将obj1
和obj2
字符串的第一个字符提取为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/