我想使用NSSortdescriptor使用指向NSDate值的鍵對NSFetchRequest結果進行排序。我的提取結果完全是隨機的,沒有明確的理由。NSSortdescriptor對從NSManagedContext獲取結果無效
我正在使用的NSManagedObjectContext更新爲在NSOperation的子類上創建的嵌套子上下文的保存。我知道所有這些都是成功完成的,因爲我可以從父(主)上下文獲取所有需要的數據。從它取得只是不會在日期排序!
奇怪的是,在兩個日期之間選擇實體(稱爲「鳴叫」)的謂詞工作得很好!
下面是一些代碼來說明我的問題:
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不是爲我取的工作?
謝謝!
- 更新 -
看來NSSortDescriptor工作正常,當我從主線程的主(父)managedObjectContext取不使用performBlock方法。這仍然不能幫助我對NSPrivateQueueConcurrencyType managedObjectContext進行排序。在performBlock中創建NSFetchRequest,NSSortDescriptor和NSPredicate也不能解決問題。