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)