- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在请求中使用 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]);
}
}];
}
最佳答案
事实证明,这个问题是由于对 managedObjectContext
的更改是从另一个使用 NSManagedObjectContextDidSaveNotification
的上下文传播的。这篇博文详细解释了为什么这会导致 NSFetchedResultsController
出现问题,以及如何修复它:
http://www.mlsite.net/blog/?p=518
这是我上面代码上下文中的具体修复:
+(void)mergeChanges:(NSNotification*)notification {
NSManagedObjectContext *context = [self mainContext];
// Fault all objects that have changed so that NSFetchedResultsController will see the changes.
NSArray *objects = [[notification userInfo] objectForKey:NSUpdatedObjectsKey];
for (NSManagedObject *object in objects) {
[[context objectWithID:[object objectID]] willAccessValueForKey:nil];
}
[context performBlock:^{
[context mergeChangesFromContextDidSaveNotification:notification];
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"error merging changes %@, %@", error, [error userInfo]);
}
}];
}
关于ios - NSFetchedResultsController 并不总是调用 didChangeObject :atIndexPath:forChangeType:newIndexPath: for NSFetchedResultsChangeMove,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25588624/
我有一个 UITableView,它使用 2 个 NSFetchedResultsControllers。每个 NSFetchedResultsController 只有一个部分。但是,该表有 4 个
我正在学习 Swift 的同时构建一个博客阅读器。在此,我将数据保存到核心数据,并可以选择将文章标记为“已读”。当我使用 editActionsForRowsAtIndexPath 将它们单独标记为已
我已指定 NSFetchtedResultsController 作为属性... @property (nonatomic, strong) NSFetchedResultsController *c
我有一个带有核心数据的主/细节应用程序。我是核心数据的新手,所以我不明白为什么当我添加一个新实体时 context.save(&error) 返回 false (例如因为我不t 设置非可选属性)fun
我有一个由 NSFetchedResultsController 支持的 UITableView,它显示已被用户添加为书签的项目。项目可以从行内的按钮取消书签,这会导致问题。项目取消书签后,它应该从
我几乎尝试了所有方法,但无法弄清楚哪里出了问题。我有一个 NSFetchedResultsController 并从核心数据中获取一些帖子。然后我有一种方法,可以将新帖子插入同一上下文并保存上下文。通
我正在使用 NSFetchedResultsController 来管理带有 CoreData 的 PSTCollectionView 的实现。当我实现以下方法时,indexPath 和 newInd
这是代码,我通过 Magical Record 保存模型: MagicalRecord.saveWithBlock({ (localContext) -> Void in
在 Swift 2.0 中转换后我无法解决问题: "Objective-C method 'controller:didChangeObject:atIndexPath:forChangeType:n
在所有数据下载并插入 coreData 后,我使用 NSFetchedResultsControllerDelegate 显示我的单元格。我使用下面的代码来了解何时发生修改 [NSNotificati
我在请求中使用 NSFetchedResultsController 和 sortDescriptors 来填充包含大量结果的表。我注意到,当发生将行从表底部附近移动到顶部的更改时,根本不会调用 di
我在我的 UITableView 中使用 NSFetchedResultsController。我成功接收到对 - (void)controller:(NSFetchedResultsControll
Objective-C method 'controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:' provided by
我是一名优秀的程序员,十分优秀!