我正在尝试使用 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 对我的提取不起作用?
谢谢!
- 更新 -
当我从主线程上的主(父) managedObjectContext 获取而不使用 performBlock 方法时,NSSortDescriptor 似乎工作正常。这仍然不能帮助我对 NSPrivateQueueConcurrencyType managedObjectContext 进行排序提取。在 performBlock 中创建 NSFetchRequest、NSSortDescriptor 和 NSPredicate 也不能解决问题。