【问题标题】:How to Sort an NSMutableArray of Managed Objects through an object graph如何通过对象图对托管对象的 NSMutableArray 进行排序
【发布时间】:2009-08-28 18:58:02
【问题描述】:

我不熟悉 Apple 的 iPhone 3.0 SDK 对 Core Data 的支持,而且我对 iPhone 开发也比较陌生。我的问题是比文档中涵盖的更“复杂”的排序。我怀疑我做出了一个不正确的基本假设。

如何按包含在集合中更深几层的属性对预取的托管对象集合进行排序?

示例: 农场有一个 1 对多的牛仔 (Farm.cowboys) Cowboy 有一个 1 对 1 对人 (Cowboy.person) 人有姓(Person.lastName)

已获取整个对象图,并通过 UITableView 显示牛仔。现在,如何按姓氏对牛仔进行排序?我需要重新获取它们吗?如果是,我该如何使用嵌套排序?

目前我正在尝试对牛仔 ([Farm.cowboys allobjects]) 的 NSMutableArray 进行排序,这对于 Cowboy 上的这些属性很好。但我不知道在按 Cowboy.person.lastName 对 Cowboys 集合进行排序时如何进行这项工作?

【问题讨论】:

    标签: iphone-sdk-3.0 sorting core-data nsmutablearray


    【解决方案1】:

    如果您可以以 10.6 为目标,则可以使用块来完成此操作。像这样:

    - (NSArray *)sortedArray {
        return [originalArray sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2){
        NSString *lastName1 = [[obj1 person] lastName];
        NSString *lastName2 = [[obj2 person] lastName];
        return [lastName1 caseInsensitiveCompare:lastName2]; }];
    }
    

    【讨论】:

    • 另外值得注意的是,如果您使用的是NSMutableArray,如果您愿意,也可以使用sortUsingComparator:
    • 你应该移除强制转换到 NSComparator。
    【解决方案2】:

    你可以这样排序:

    [myUnsortedArrayOfCowboys sortedArrayUsingDescriptors:
        [NSArray arrayWithObject:
            [NSSortDescriptor
                sortDescriptorWithKey:"person.lastName"
                ascending:YES]]];
    

    注意“。”在排序描述符键中。这就是您遍历对象图的方式。

    【讨论】:

      【解决方案3】:

      如果要对数字和字符串进行排序,请使用此

      NSArray *unsortedArray = [NSArray arrayWithObjects:@"Hello", @"4", @"Hi", @"5", @"2", @"10", @"1", nil];
      NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^(id firstObject, id secondObject) {
          return [((NSString *)firstObject) compare:((NSString *)secondObject) options:NSNumericSearch];
      }];
      

      【讨论】:

        【解决方案4】:

        希望有人有更好的解决方案。不过……

        具有比较选择器和对排序对象的引用的包装器对象有效。它不像我想要的那么干净,所以希望其他人会想出一个替代方案。

        本质上 CowboyWrapper 有一个牛仔属性。 CowboyWrapper 还有一个比较选择器。通过构建 CowboyWrappers 的 NSMutableArray 并使之保持同步,排序就可以工作了。

        【讨论】:

          猜你喜欢
          • 2023-04-11
          • 1970-01-01
          • 1970-01-01
          • 2019-05-13
          • 2013-11-08
          • 1970-01-01
          • 1970-01-01
          • 2013-04-03
          • 2012-01-17
          相关资源
          最近更新 更多