问题:
当我通过下拉刷新控件(删除所有内容,然后再次添加所有内容)进行总体核心数据刷新时,我的自动 NSFetchedResultsController (CoreDataTableViewController) 只会删除所有行并且不显示新数据。
我的设置:
我使用 Core Data 数据存储,通过使用CoreDataTableVewController的子类从中获取数据。在这种情况下,我有一个登录用户添加到的组列表,它是通过使用谓词获取的:
[NSPredicate predicateWithFormat:@"users CONTAINS %@", self.currentUser];
然后,我使用数据存储刷新功能(与应用程序启动时相同)通过下拉刷新控件 ( SVPullToRefresh ) 刷新数据。
[self.tableView addPullToRefreshWithActionHandler:^{
DatabaseMerger *merger = [DatabaseMerger sharedInstance];
[merger refreshDatabase:self.context];
self.tableView.pullToRefreshView.lastUpdatedDate = [NSDate date];
}];
在此刷新中,所有核心数据托管对象都被删除,然后使用 JSON 数据再次添加。
通过使用观察上下文的 CoreDataTableViewController,如果上下文发生变化,应该刷新行。目前,唯一改变的是所有行都消失了。
奇怪的是,当我弹出视图控制器并再次按下它(通过导航栏的后退按钮)时,行与数据一起正确显示。在我看来,这是实时获取数据的问题。
我试过的:
- 通过使用手动重新获取数据
[self.fetchedresultscontroller performFetch:&error]
- 通过使用删除 fetchedresultscontroller 的缓存
[NSFetchedResultsController deleteCacheWithName:nil]
- 将 fetchresultscontroller 设置为 nil,然后重新设置控制器
相关代码:
- (void)setupFetchedResultsController
{
NSFetchRequest *groupRequest = [NSFetchRequest fetchRequestWithEntityName:@"Group"];
groupRequest.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]];
groupRequest.predicate = [NSPredicate predicateWithFormat:@"users CONTAINS %@", self.currentUser];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:groupRequest managedObjectContext:self.context sectionNameKeyPath:nil cacheName:nil];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self setupFetchedResultsController];
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.debug = YES;
self.currentUser = [Settings currentUser:self.context];
[self.tableView addPullToRefreshWithActionHandler:^{
DatabaseMerger *merger = [DatabaseMerger sharedInstance];
[merger refreshDatabase:self.context];
self.tableView.pullToRefreshView.lastUpdatedDate = [NSDate date];
}];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(receiveFinishedNotification:)
name:@"dataMergeFinished"
object:nil];
// Do any additional setup after loading the view.
}
- (void)receiveFinishedNotification:(NSNotification *) notification
{
if ([[notification name] isEqualToString:@"dataMergeFinished"]) {
[self.tableView.pullToRefreshView stopAnimating];
[NSFetchedResultsController deleteCacheWithName:nil];
NSError *error = nil;
[self.fetchedResultsController performFetch:&error];
if (error) {
DebugLog(@"Error: %@", error);
}
}
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
self.fetchedResultsController = nil;
}
我正在使用带有 ARC 的 iOS 5.1.1