Ios 离奇的问题——”;索引x处获取的对象有一个无序的节名“quot;

Ios 离奇的问题——”;索引x处获取的对象有一个无序的节名“quot;,ios,core-data,nsfetchedresultscontroller,Ios,Core Data,Nsfetchedresultscontroller,我收到以下错误消息: CoreData: error: (NSFetchedResultsController) The fetched object at index 5 has an out of order section name 'James. Objects must be sorted by section name' Unresolved search error Error Domain=NSCocoaErrorDomain Code=134060 "The operation

我收到以下错误消息:

CoreData: error: (NSFetchedResultsController) The fetched object at index 5 has an out of order section name 'James. Objects must be sorted by section name'
Unresolved search error Error Domain=NSCocoaErrorDomain Code=134060 "The operation couldn’t be completed. (Cocoa error 134060.)" UserInfo=0xaa07530 {reason=The fetched object at index 5 has an out of order section name 'James. Objects must be sorted by section name'}, {
    reason = "The fetched object at index 5 has an out of order section name 'James. Objects must be sorted by section name'";
}
我已经阅读了无数的答案,大部分答案都指向使用不区分大小写的比较作为答案,但是正如您在下面看到的,我的获取请求已经设置为执行此操作:

<NSFetchRequest: 0xc082bd0> (entity: InviteeModel; predicate: (eventId == 148 AND typeOf != "InviteeTypeOfServerContact"); sortDescriptors: ((
    "(lastName, ascending, caseInsensitiveCompare:)",
    "(firstName, ascending, caseInsensitiveCompare:)"
)); batch size: 1000; type: NSManagedObjectResultType; )
下面是buildFetchRequest中添加SortDescriptor的一部分:

        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:self.sortBy
                                                                       ascending:self.shouldSortAscending
                                                                        selector:@selector(caseInsensitiveCompare:)];

        // Add the default sorts (last, first).
        NSSortDescriptor *lastSort = nil;
        NSSortDescriptor *firstSort = nil;
        if (![self.sortBy isEqualToString:@"lastName"]) {
            lastSort = [NSSortDescriptor sortDescriptorWithKey:@"lastName"
                                                     ascending:YES
                                                      selector:@selector(caseInsensitiveCompare:)];
        }
        if (![self.sortBy isEqualToString:@"firstName"]) {
            firstSort = [NSSortDescriptor sortDescriptorWithKey:@"firstName"
                                                      ascending:YES
                                                       selector:@selector(caseInsensitiveCompare:)];
        }

        NSArray *sorts = nil;

        if (lastSort && firstSort) {
            sorts = [[NSArray alloc] initWithObjects:sortDescriptor, lastSort, firstSort, nil];
        }
        else if (lastSort) {
            sorts = [[NSArray alloc] initWithObjects:sortDescriptor, lastSort, nil];
        }
        else {
            sorts = [[NSArray alloc] initWithObjects:sortDescriptor, firstSort, nil];
        }

        [fetchRequest setSortDescriptors:sorts];

任何想法,这都快把我逼疯了。

您正在设置一个不同于第一个排序描述符键的获取结果控制器节名称键路径

   NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] 
           initWithKey:self.sortBy 
           ascending:self.shouldSortAscending
           selector:@selector(caseInsensitiveCompare:)];
键是
self.sortBy

if ([self.sortBy isEqualToString:@"rsvpState"] || 
    [self.sortBy isEqualToString:@"checkedIn"]) {
       sectionNameKeyPath = @"lastName";
}
键是而不是
self.sortBy

if ([self.sortBy isEqualToString:@"rsvpState"] || 
    [self.sortBy isEqualToString:@"checkedIn"]) {
       sectionNameKeyPath = @"lastName";
}

这将导致您看到的错误。

关键问题是哪个属性决定sectionNameKeyPath 以及该属性是否已用作排序描述符数组中的第一个排序描述符


我想这是检查你是否有这样的问题的第一件事

你能记录完整的fetchedResultsController吗?@MartinR,谢谢你的帮助。你在财务汇报中有什么具体的东西我可以打印出来吗?这是一个大对象,它只给我地址。我的主要问题是sectionNameKeyPath和第一个排序描述符是否总是使用相同的键。从您的代码中我看不太清楚。您好@Mundi,我已经打印出self.sortBy和FRC sectionNameKeyPath的值,即使出现错误,它也始终是“lastName”,所以我不确定是否是它?还打印出第一个排序描述符的键路径并进行比较。