0

问题:

当我通过下拉刷新控件(删除所有内容,然后再次添加所有内容)进行总体核心数据刷新时,我的自动 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

4

1 回答 1

0

您是否实现了 NSFetchedResultsController 委托?如果您没有 FRC,则不会自动更新。

执行以下操作:

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

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

    [self.tableView reloadData];
}

那应该刷新您的表格视图

于 2012-08-15T10:36:36.110 回答