[英]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.