[英]NSFetchedResultsControllerDelegate delegates methods are not called
[英]NSFetchedResultsControllerDelegate methods not called when UITableView is a subview of UIView (data initially loads)
我有一个UIView
包含UITableView
。 这些由继承自委托方法UITableViewDelegate
和NSFetchedResultsControllerDelegate
的UIViewController
管理。 我可以使用NSFetchedResultsController
很好地填充表,但是在对fetchObjects
托管对象进行更改时,不会调用委托方法(特别是controllerWillChangeContent
)。
我已经独立检查了对对象所做的更改,这些更改已反映在单元格中,但是您必须手动重新加载单元格(向上滚动)才能看到更改。 我正在寻找的行为是,当对对象进行更改(通过保存)时,将触发NSFetchedResultsControllerDelegate
方法,以便可以对表视图进行更新。
需要明确的是,在加载视图时,数据是从数据库中填充的,所以我知道代码可以正常运行。
头接口
@interface HSAwardsViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, NSFetchedResultsControllerDelegate>
@property (nonatomic, retain) IBOutlet UITableView *tableView;
@property (nonatomic, retain) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@end
初始化方法-设置ManagedObjectContext(使用Magical Record)
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
HSInternalDB *dbInstance = [HSInternalDB getInternalDB];
self.persistentStoreCoordinator = [dbInstance getPersistentStoreCoordinator];
self.managedObjectContext = [NSManagedObjectContext MR_contextWithStoreCoordinator:self.persistentStoreCoordinator];
self.tableView.delegate = self;
self.tableView.dataSource = self;
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
}
return self;
}
设置NSFetchedResultsController并分配委托
- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Award"];
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"gameTypeIdentifier" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
[fetchRequest setFetchBatchSize:20];
NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
NSError *error = nil;
[theFetchedResultsController performFetch:&error];
theFetchedResultsController.delegate = self;
self.fetchedResultsController = theFetchedResultsController;
// Listen for this notification so that the managedObjectContext runs on the main thread
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextChanged:) name:NSManagedObjectContextDidSaveNotification object:nil];
return _fetchedResultsController;
}
- (void)contextChanged:(NSNotification*)notification
{
NSManagedObjectContext *context = [notification object];
if ([context isEqual:self.managedObjectContext]) {
return;
}
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(contextChanged:) withObject:notification waitUntilDone:YES];
return;
}
[[self managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];
}
据我所知,所有连接都是通过代码或情节提要进行的。 我知道数据库中记录了更改,因为我正在监听NSManagedObjectContextDidSaveNotification
。
这让我感到难过,因此,我感谢任何建议或面包屑。 我很乐意回答任何问题或在需要时发布更多代码!
contextChanged:应该在MainThread上调用,因为它涉及UI更新。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.