2012-08-15 84 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