Search code examples
objective-ciosipadnsfetchedresultscontrolleraqgridview

AQGridView backed by a NSFetchedResultsController


I'm trying to implement a AQGridView that uses a fetched results controller as its datasource.

I'm not particular sure how to handle the NSFetchedResultsController delegate methods using the grid view; namely the content changing ones. I understand how to use the FRC for the other grid view datasource delegates.

Could somebody point me in the right direction?


Solution

  • The result should look a little something like this:

    - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
    {
      [gridView beginUpdates];
    }
    
    - (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
           atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
    {
      switch(type)
      {
        case NSFetchedResultsChangeInsert:
          break; 
        case NSFetchedResultsChangeDelete:
          break;
      }
    }
    
    - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath
    {
    
      ChannelPageViewController *currentPageController, *destinationPageController;
    
      NSIndexSet * indices = [[NSIndexSet alloc] initWithIndex: indexPath.row];
      NSIndexSet *newIndices = [[NSIndexSet alloc] initWithIndex:newIndexPath.row];
    
      switch(type) {
          case NSFetchedResultsChangeInsert:
            [gridView insertItemsAtIndices:newIndices withAnimation:AQGridViewItemAnimationNone];
          break;
    
          case NSFetchedResultsChangeDelete:
            [gridView deleteItemsAtIndices:indices withAnimation:AQGridViewItemAnimationNone];
            break;
    
          case NSFetchedResultsChangeUpdate:
            [gridView reloadItemsAtIndices:indices withAnimation:AQGridViewItemAnimationNone];
            break;
    
          case NSFetchedResultsChangeMove:
            [gridView deleteItemsAtIndices:indices withAnimation:AQGridViewItemAnimationNone];
            [gridView insertItemsAtIndices:newIndices withAnimation:AQGridViewItemAnimationNone];
            break;
       }
    }
    
    - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
    {
      [gridView endUpdates];
      if ([[frc fetchedObjects] count] == 1) {
        [gridView reloadData];
      }
    
    }