Objective c NSSortdescriptor对从NSManagedContext获取结果无效

Objective c NSSortdescriptor对从NSManagedContext获取结果无效,objective-c,nsdate,nsfetchrequest,nssortdescriptor,Objective C,Nsdate,Nsfetchrequest,Nssortdescriptor,我正在尝试使用NSSortdescriptor(使用指向NSDate值的键)对NSFetchRequest结果进行排序。我的取回结果完全是随机的,没有明确的原因 我正在使用的NSManagedObjectContext使用NSOperation子类上创建的嵌套子上下文中的保存进行更新。我知道所有这些都成功地完成了,因为我可以从父(主)上下文获取所需的所有数据。从它取回只是不会按日期排序 奇怪的是;在两个日期之间选择实体(称为“Tweet”)的谓词工作得很好 下面是一些代码来说明我的问题: NSS

我正在尝试使用NSSortdescriptor(使用指向NSDate值的键)对NSFetchRequest结果进行排序。我的取回结果完全是随机的,没有明确的原因

我正在使用的NSManagedObjectContext使用NSOperation子类上创建的嵌套子上下文中的保存进行更新。我知道所有这些都成功地完成了,因为我可以从父(主)上下文获取所需的所有数据。从它取回只是不会按日期排序

奇怪的是;在两个日期之间选择实体(称为“Tweet”)的谓词工作得很好

下面是一些代码来说明我的问题:

NSSortDescriptor* timeDescriptor = [NSSortDescriptor
                                        sortDescriptorWithKey:@"time"
                                        ascending:NO
                                        selector:@selector(compare:)];

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Tweet"];
[request setSortDescriptors:[NSArray arrayWithObjects:timeDescriptor, nil]];

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"((time >= %@) AND (time <= %@))",startDate,endDate];
[request setPredicate:predicate];

NSManagedObjectContext* context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setParentContext:[[NSApp delegate] managedObjectContext]];
[context performBlock:^{
    NSError* error = nil;
    NSArray* results = nil;

    results = [context executeFetchRequest:request error:&error];
    // Results here are not ordered correctly

    // 2nd try sorting results using fetched array (works!)
    results = [results sortedArrayUsingDescriptors:[NSArray arrayWithObjects:timeDescriptor, nil]];

    // This works too but not needed anymore
    /*results = [results sortedArrayUsingComparator:^(id obj1, id obj2) {
        Tweet* tweet1 = (Tweet*)obj1;
        Tweet* tweet2 = (Tweet*)obj2;
        //return [tweet1.time compare:tweet2.time]; // ascending
        return [tweet2.time compare:tweet1.time]; // descending
    }];*/

    if ([results count] > 0) {
        for (uint i = 0; i < [results count]; i++) {
            Tweet* tweet = [results objectAtIndex:i];
            NSDate* date = Tweet.time;
            NSLog(@"tweet date: %@", date);
        }
    }
}];
NSSortDescriptor*timeDescriptor=[NSSortDescriptor]
SortDescriptor WithKey:@“时间”
升序:没有
选择器:@selector(比较:)];
NSFetchRequest*request=[NSFetchRequest fetchRequestWithEntityName:@“Tweet”];
[请求设置端口描述符:[NSArray arrayWithObjects:timeDescriptor,nil]];

NSPredicate*谓词=[NSPredicate谓词WithFormat:@”((时间>=%@)和(时间使用默认的比较:选择器时,可以简化描述符:

NSSortDescriptor* timeDescriptor = [NSSortDescriptor
                                        sortDescriptorWithKey:@"time"
                                        ascending:NO];
但这是一个旁白。我认为关键是您正在从嵌套的子上下文进行更新。请验证您的对象是否具有永久对象ID;它们可能尚未接收到永久对象ID,因此这可能是您的提取问题。如果是,请在保存嵌套的子上下文之前尝试调用objectPermanentIDsForObjects:。

我也碰到了这个问题。 我发现,除非数据一直保存到持久存储,否则如果主上下文中的数据是脏的,即修改的,排序将无法工作

例如,如果上下文是干净的,没有挂起的更改,则排序工作正常。 如果我只更改父上下文中实体的一个属性,则专用队列子上下文中的排序不起作用。这非常不幸。我现在也使用array方法进行排序,但排序速度不如NSFetchRequest中的排序快,特别是因为我的数据已经由该键索引。排序速度会快得多它在获取请求中被删除

我的猜测是,由于上下文中存在未保存的更改,并且NSFetchRequest会转到SQLite数据库本身,而这些更改还不存在(上下文未保存),因此它根本无法在数据库级别进行排序


但总的来说,它非常混乱,闻起来像个bug。

我也遇到了完全相同的问题。我通过将NSFetchRequest实例中的includesPendingChanges属性设置为NO解决了这个问题