2010-08-24 36 views
0

我正在使用NSFetchedResultsController填充我的UITableViewController的內容。刷新和刪除後臺線程錯誤(NSFetchedResultsController)內容

我使用的NSOperation從web服務(我使用分離ManagedObjectContext,因爲它是另一個線程)
當數據被保存我的視圖控制器(至極是NSFetchedResultsControllerDelegate)收集的數據被調用,我合併我的使用mergeChangesFromContextDidSaveNotification

#pragma mark - 
#pragma mark Parsers delegate 

- (void)parserWillSave:(id)parser{ 
    TopNewsParser *emp = (TopNewsParser *)parser; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(parserContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:emp.managedObjectContext]; 
    [NSFetchedResultsController deleteCacheWithName:@"aLaUne"]; 
} 

- (void)parserDidSave:(id)parser{ 
    TopNewsParser *emp = (TopNewsParser *)parser; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:emp.managedObjectContext]; 
} 

/** 
Notification from the add controller's context's save operation. This is used to update the fetched results controller's managed object context with the new book instead of performing a fetch (which would be a much more computationally expensive operation). 
*/ 
- (void)parserContextDidSave:(NSNotification*)saveNotification { 
    DLog(@""); 
    NSManagedObjectContext *fetchContext = [_fetchedResultsController managedObjectContext]; 
    // Merging changes causes the fetched results controller to update its results 
    [fetchContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) 
            withObject:saveNotification 
           waitUntilDone:YES]; 


} 

MOCS對於NSFetchedResultsControllerDelegate我正在使用的代碼從CoreData書籍樣本

#pragma mark - 
#pragma mark NSFetchedResultsControllerDelegate 

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 
    // The fetch controller is about to start sending change notifications, so prepare the table view for updates. 

    [self.tableView beginUpdates]; 
} 


- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { 
    //ALog(@"indexPath: %@ newIndexPath : %@ | type : %d # %@",indexPath,newIndexPath,type,anObject); 
    UITableView *tableView = self.tableView; 

    switch(type) { 

     case NSFetchedResultsChangeInsert: 
      [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeDelete: 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeUpdate: 
      [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
      break; 

     case NSFetchedResultsChangeMove: 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      // Reloading the section inserts a new row and ensures that titles are updated appropriately. 
      [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 

} 


- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type { 

    switch(type) { 

     case NSFetchedResultsChangeInsert: 
      [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeDelete: 
      [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 
} 


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    UIBarButtonItem *reloadButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh 
                        target:self        
                        action:@selector(refreshTableViewContent)]; 
    reloadButton.accessibilityLabel = @"Reload"; 
    self.navigationItem.leftBarButtonItem = reloadButton; 

    // The fetch controller has sent all current change notifications, so tell the table view to process all updates. 
    [self.tableView endUpdates]; 

} 

我的問題是當加載新的內容,其中一些對象刪除,我的tableView搞砸了!

然後當我向下滾動,我的tableview是空的(只有4個可見行)仍然在tableview中,否則這是一個空白的滾動視圖

在:即使我的countOfRow減少1行仍然可見控制檯我可以看到以下消息。

嚴重的應用程序錯誤。在調用-controllerDidChangeContent:期間,NSFetchedResultsController的委託捕獲到異常。 *** - [NSMutableArray的removeObjectAtIndex:]:索引0超越界限的空數組與用戶信息(空)

在我因子評分,這是由於我的NSFetchedResultsController的緩存,但即使我禁用它,我有beggining一樣的問題。

有人對如何解決這個問題有想法嗎?

回答