微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如果我想按字母顺序对项目数组进行排序而不选择NSDiacriticInsensitiveSearch,我需要使用带比较器的NSSortDescriptor
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];

但是,这种带比较器的NSSortDescriptor不允许在NSFetchRequest中使用.
因此,我应该从核心数据中获取结果后对结果进行排序吗?这在性能方面是否具有计算成本?

谢谢

解决方法

我能想到两种方法

>因此,我应该在从核心数据中获取结果后对结果进行排序吗? – 这是一种做法. Apple没有提供精确的字符串排序复杂性,但我认为更大的问题是需要首先从持久性存储中获取所有对象.如果您有大量数据,则可能会影响性能.最好对其进行分析,然后才决定性能是否可以接受.
>您可以尝试使用转换为sql的Nsstring方法:localizedStandardCompare:,localizedCompare:或localizedCaseInsensitiveCompare:.可以使用以下方法创建使用任何这些方法的排序描述符:

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

如果这些方法都不按您希望的方式对数据进行排序,您也可以事先对其进行预处理,例如:当标题发生变化时,您将删除变音符号等(请参阅在NSHipster – CFStringTransform处标准化用户生成内容).更新:我假设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];
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐