Ios 带pull to refresh的NSFetchedResultsController在更新后不显示任何内容
问题:Ios 带pull to refresh的NSFetchedResultsController在更新后不显示任何内容,ios,ipad,core-data,refresh,nsfetchedresultscontroller,Ios,Ipad,Core Data,Refresh,Nsfetchedresultscontroller,问题: - (void)setupFetchedResultsController { NSFetchRequest *groupRequest = [NSFetchRequest fetchRequestWithEntityName:@"Group"]; groupRequest.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascen
- (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;
}
当我通过pull to refresh控件(删除所有内容,然后再次添加所有内容)执行总体核心数据刷新时,我的自动NSFetchedResultsController(CoreDataTableViewController)只删除所有行,不显示新数据
我的设置:
- (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;
}
我使用一个核心数据存储,通过使用。在本例中,我有一个已登录用户添加到的组列表,该列表使用谓词获取:
[NSPredicate predicateWithFormat:@“users CONTAINS%@”,self.currentUser]代码>
然后,我使用数据存储刷新功能(与应用程序启动时相同)通过pull to refresh控件()刷新数据
在这次刷新中,所有核心数据管理对象都被删除,然后使用JSON数据再次添加
通过使用CoreDataTableViewController观察上下文,如果上下文发生更改,则应刷新行。目前,唯一改变的是,所有行都消失了
奇怪的是,当我弹出viewcontroller并再次按下它(通过navigationbar的后退按钮)时,行与数据一起正确显示。在我看来,这是一个实时获取数据的问题
我尝试过的:
- (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;
}
- 通过使用
[self.fetchedresultscontroller performFetch:&错误]
- 通过使用
[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;
}
我将iOS 5.1.1与ARC一起使用您是否实现了NSFetchedResultsController委托?如果没有,FRC将不会自动更新
实施以下措施:
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
NSLog(@"POSTDETAIL: controllerWillChangeContent");
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
NSLog(@"POSTDETAIL: controllerDidChangeContent");
[self.tableView reloadData];
}
这将刷新您的表视图是的。我正在使用CoreDataTableViewController子类。这是UITableViewController的一个子类,它实现了所有NSFetchedResultsController的方法和委托,并允许在上下文更改时自动更新。因此,我认为要么更新后的上下文错误(不太可能,因为重新打开viewcontroller会提供正确的数据),要么我的类实现有问题。我在我的类中做了几乎完全相同的事情,但在进行合并后,我必须调用[self.fetchedResultsController performFetch:&error],然后[self.tableView reloadData];我没有将UITableViewController子类化,但是reloadData对于让tableView显示更新的数据很重要(特别是因为我的初始获取可能会返回0个结果,然后我执行web api调用/合并,然后再执行performFetch)