变音符号 对从核心数据中提取的对象进行敏感排序?



如果我想在没有选项的情况下按字母顺序对项目数组进行排序NSDiacriticInsensitiveSearch我需要使用带有comparatorNSSortDescriptor

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"SortTitle" ascending:YES comparator:
^(id obj1, id obj2) {
NSInteger options = NSCaseInsensitiveSearch
| NSNumericSearch                    // Numbers are compared using numeric value
//  | NSDiacriticInsensitiveSearch  // Ignores diacritics (â == á == a)
| NSWidthInsensitiveSearch;        // Unicode special width is ignored
return [(NSString*)obj1 compare:obj2 options:options];

但是,这种带有比较器的NSSort描述符不允许在NSFetchRequest中使用。 因此,我应该在从核心数据中获取结果对结果进行排序吗?就性能而言,这在计算上是否昂贵?

谢谢

我能想到两种方法:

  1. Therefore should I sort the results after fetching them from core data?- 这是一种方法。Apple 没有提供确切的字符串排序复杂性,但我认为更大的问题是需要首先从持久存储中获取所有对象。如果您有大量数据,则可能会妨碍性能。最好对其进行分析,然后才确定性能是否可接受。

  2. 您可以尝试使用NSString转换为SQL的方法:localizedStandardCompare:localizedCompare:localizedCaseInsensitiveCompare:。可以通过以下方式创建使用这些方法中的任何一种的排序描述符:

    sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"sortTitle"
    ascending:YES
    selector:@selector(localizedCaseInsensitiveCompare:)];
    

    如果这些方法都没有按照您想要的方式对数据进行排序,您也可以事先对其进行预处理,例如,当标题更改时,您删除变音符号等(请参阅NSHipster - CFStringTransformNormalize User-Generated Content)。更新:让我假设 title 属性名为title,排序标题名为sortTitle。在NSManagedObject的子类中,您可以按如下方式覆盖didChangeValueForKey:

    - (void)didChangeValueForKey:(NSString *)key
    {
    [super didChangeValueForKey:key];
    if ([key isEqualToString:@"title"]) {
    NSString *cleanTitle = [self.title mutableCopy];
    CFStringTransform((__bridge CFMutableStringRef)(cleanTitle), NULL, kCFStringTransformStripCombiningMarks, NO);
    self.sortTitle = [cleanTitle copy];
    }
    }
    

最新更新