【问题标题】:Sort NSArray with multiple predicates in Objective C在Objective C中使用多个谓词对NSArray进行排序
【发布时间】:2016-08-31 05:57:14
【问题描述】:

我有一个包含一些核心数据对象的数组。每个对象都有三个属性,例如“First Name”和“Last Name

我想根据搜索字母对数组进行过滤和排序。最终列表应按以下顺序排列:

  • 以名字开头的记录应该放在第一位
  • 以姓氏开头的记录应该排在第二位
  • 包含名字的记录应该排在第三位
  • 包含姓氏的记录应该排在第四位

我在创建谓词和排序描述符时感到困惑。有人可以帮忙吗?

编辑:

这是我获取的结果控制器:

-(NSFetchedResultsController *)myFetchedResultsController
{
    if (!_myFetchedResultsController)
    {
        ...
        ...

        NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:MY_ENTITY_NAME];

        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(firstName beginswith[cd] %@) || (lastName beginswith[cd] %@) || (firstName contains[cd] %@) || (lastName contains[cd] %@))", self.searchText, self.searchText, self.searchText, self.searchText];

        [fetchRequest setPredicate:predicate];


        //I really dont have idea about how to set sort description to this scenario

        NSSortDescriptor *firstNameDescriptors = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
        NSSortDescriptor *lastNameDescriptors = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];

        [fetchRequest setSortDescriptors:@[firstNameDescriptors, lastNameDescriptors]];

        _userFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:appDelegate.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    }

    return _myFetchedResultsController;
}

但这似乎不起作用,意味着它不对对象进行排序。

【问题讨论】:

  • 能否请您展示您尝试过的方法以及您遇到的问题?

标签: objective-c sorting nsarray filtering nspredicate


【解决方案1】:

但这似乎不起作用,意味着它不对对象进行排序。

你真的是说它没有排序,或者它没有按照你希望的方式排序?

NSSortDescriptor 采用单个键进行排序。在您有一个主键和一个辅助键的情况下,仅当主键相等时才使用辅助键进行排序,例如姓氏,然后是名字,然后是诸如setSortDescriptors:之类的例程,它们采用排序描述符数组。这是您在代码中设置的那种类型。

但是,这不是您在项目符号中指定的那种类型。您的排序需要访问多个键来确定顺序 - 它表示第一个键满足特定条件然后按该键排序,否则如果第二个键满足特定条件则按该键排序,等等。执行这种你可以编写一个NSComparator 块,它可以访问完整的对象——而不仅仅是特定键的值——并将你的算法实现为测试和比较的组合。

很遗憾,NSFetchRequest 不直接支持第二种排序方式。相反,您需要在不进行排序的情况下获得结果,然后使用sortedArrayUsingComparator: 等方法对结果数组进行排序。

有关相关问题,请参阅NSSortDescriptor: Custom comparison on multiple keys simultaneously

HTH

【讨论】:

    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    相关资源
    最近更新 更多