2012-08-15 44 views
0

问题:NSFetchedResultsController上拉来刷新显示更新后没有

当我通过一个上拉来刷新控制总核心数据刷新(删除一切,然后再加入一切),我自动NSFetchedResultsController(CoreDataTableViewController)只删除所有行并不显示新数据。

我的设置:

我使用核心数据的数据存储这是我从通过使用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]
  • ,重新获取数据通过使用[NSFetchedResultsController deleteCacheWithName:nil]
  • 设置fetchresultscontroller为零删除fetchedresultscontroller的缓存中,然后设置控制器再次起来

相关代码:

- (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

回答

0

您已实现NSFetchedResultsController代表的iOS 5.1.1?如果你没有FRC不会自动更新。

执行以下操作:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
{ 
    NSLog(@"POSTDETAIL: controllerWillChangeContent"); 
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    NSLog(@"POSTDETAIL: controllerDidChangeContent"); 

    [self.tableView reloadData]; 
} 

这应该刷新你的表视图

+0

呀。我正在使用CoreDataTableViewController子类。这是UITableViewController的一个子类,它实现了所有NSFetchedResultsController的方法和委托,并允许在上下文更改时进行自动更新。所以我认为更新后的上下文是错误的(不太可能,因为重新打开viewcontroller给出正确的数据),或者我的类的实现有问题。 – Thermometer 2012-08-15 11:57:58

+0

我在类中做了几乎完全相同的事情,但是在完成合并之后,我有*调用[self.fetchedResultsController performFetch:&error],然后[self.tableView reloadData];我没有UITableViewController的子类 - 但reloadData很重要,让tableview显示更新的数据(具体来说,因为我的初始抓取可能会返回0结果,然后我做一个web-api调用/合并,然后performFetch) – 2012-08-15 13:02:26