0

問題:

プルツーリフレッシュコントロールを介してコアデータ全体を更新すると(すべてを削除してから再度追加する)、自動NSFetchedResultsController(CoreDataTableViewController)はすべての行を削除するだけで、新しいデータは表示されません。

私のセットアップ:

CoreDataTableVewControllerのサブクラスを使用してデータをフェッチするCoreDataデータストアを使用しています。この場合、ログインしたユーザーが追加されたグループのリストがあります。これは、述語を使用してフェッチされます。

[NSPredicate predicateWithFormat:@"users CONTAINS %@", self.currentUser];

次に、データストアの更新機能(アプリの起動時と同じ)を使用して、pull-to-refreshコントロール(SVPullToRefresh)を介してデータを更新します。

[self.tableView addPullToRefreshWithActionHandler:^{
        DatabaseMerger *merger = [DatabaseMerger sharedInstance];
        [merger refreshDatabase:self.context];
        self.tableView.pullToRefreshView.lastUpdatedDate = [NSDate date];
    }];

この更新では、すべてのCore Data管理対象オブジェクトが削除され、JSONデータを使用して再度追加されます。

コンテキストを監視するCoreDataTableViewControllerを使用すると、コンテキストが変更された場合に行を更新する必要があります。現在、変更されるのは、すべての行が消えることだけです。

奇妙なことに、ビューコントローラをポップして(ナビゲーションバーの戻るボタンを使用して)もう一度押すと、行がデータとともに正しく表示されます。これは、データをリアルタイムでフェッチする際の問題のように思われます。

私が試したこと:

  • を使用してデータを手動で再フェッチする[self.fetchedresultscontroller performFetch:&error]
  • を使用してフェッチされた結果コントローラーのキャッシュを削除する[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でiOS5.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 に答える