【发布时间】:2014-08-31 03:08:05
【问题描述】:
我在请求中使用NSFetchedResultsController 和sortDescriptors 来填充包含大量结果的表。我注意到,当发生将行从表格底部附近移动到顶部的更改时,根本不会调用 didChangeObject:atIndexPath:forChangeType:newIndexPath:。
奇怪的是,我可以通过遍历所有获取的对象并在调用 performFetch 后立即访问它们的任何属性来解决此问题。
关于问题可能是什么的任何提示,或者这只是一个不起眼的 Apple 错误?
这是我的代码:
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"MyObject" inManagedObjectContext:context];
request.sortDescriptors = @[NSSortDescriptor sortDescriptorWithKey:@"order" ascending:NO]];
request.fetchBatchSize = 20;
NSFetchedResultsController *fetched = [[NSFetchedResultsController alloc]
initWithFetchRequest:request
managedObjectContext:context
sectionNameKeyPath:nil
cacheName:nil];
fetched.delegate = self;
NSError *error = nil;
if (![fetched performFetch:&error]) {
NSLog(@"Unresolved error fetching objects: %@", error);
}
// Should not be necessary, but objects near the bottom won't move to the top without it.
for (MyObject *o in fetched.fetchedObjects) {
o.someAttribute;
}
2014 年 9 月 12 日更新:
我将所有数据保存在后台托管对象上下文中,这似乎与我看到的问题有关。这是我将更改从主对象上下文合并的代码:
+(void)initSaveListener {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:[self privateContext]];
}
+(void)mergeChanges:(NSNotification*)notification {
NSManagedObjectContext *context = [self mainContext];
[context performBlock:^{
[context mergeChangesFromContextDidSaveNotification:notification];
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"error merging changes %@, %@", error, [error userInfo]);
}
}];
}
【问题讨论】:
-
是什么导致了移动?从您的描述中,听起来变化正在表格视图中发生(即用户正在移动一行)
-
用户操作未导致其移动。更改发生在服务器上并流式传输到客户端并在 Core Data 中更新。这部分工作正常,在表格视图上调用 reloadData 会导致显示正确的顺序。
-
Core Data 更改是在
[self managedObjectContext]描述的上下文中发生的,是父上下文还是子上下文? -
@quellish 你是对的。这似乎与我的更改发生在后台上下文中并通过
NSManagedObjectContextDidSaveNotification传播到主上下文这一事实有关。 -
你能用处理合并通知的方法更新你的问题吗?这可能是问题所在,或者您在哪里设置通知观察
标签: ios uitableview core-data nsfetchedresultscontroller