poo*_*f86 5 objective-c nsdate nssortdescriptor nsfetchrequest
我正在尝试使用 NSSortdescriptor 使用指向 NSDate 值的键对 NSFetchRequest 结果进行排序。我的获取结果完全随机,没有明确的原因。
我正在使用的 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);
}
}
}];
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么 NSSortDescriptor 不适用于我的提取?
谢谢!
- 更新 -
当我从主线程上的主(父)managedObjectContext 获取而不使用performBlock 方法时,NSSortDescriptor 似乎工作正常。这仍然无法帮助我在 NSPrivateQueueConcurrencyType ManagedObjectContext 上进行排序获取。在performBlock 内创建NSFetchRequest、NSSortDescriptor 和NSPredicate 也不能解决问题。
我也遇到了这个问题。我发现,除非数据一直保存回持久存储,否则如果主上下文中的数据是脏的(即修改过的),则排序将不起作用。
例如,如果上下文是干净的,没有挂起的更改,则排序有效。如果我仅更改父上下文中实体的一个属性,则私有队列子上下文中的排序将不起作用。这是非常不幸的。我现在也使用数组方法进行排序,但它不如 NSFetchRequest 中的排序那么快,特别是因为我的数据已经由该键索引。在获取请求中对其进行排序会快得多。
我的猜测是,由于上下文中有未保存的更改,并且 NSFetchRequest 转到 SQLite 数据库本身,其中更改尚不存在(上下文未保存),因此它根本无法在数据库级别进行排序。
但总的来说,它非常令人困惑,而且闻起来像一个错误。
All*_*net -1
当使用默认的compare:选择器时,你可以简化描述符:
NSSortDescriptor* timeDescriptor = [NSSortDescriptor
sortDescriptorWithKey:@"time"
ascending:NO];
Run Code Online (Sandbox Code Playgroud)
但这是一个旁白。我认为关键是您正在从嵌套子上下文进行更新。验证您的对象是否具有永久对象 ID;他们可能还没有收到它们,因此这可能是您的提取问题。如果是,则在保存嵌套子上下文之前尝试调用 objectPermanentIDsForObjects: 。
| 归档时间: |
|
| 查看次数: |
1392 次 |
| 最近记录: |