2016-07-13 3 views
0

J'ai un categoryData et un itemData qui a une relation many to many. Un categoryData peut avoir plus d'un itemData et un itemData peut être dans une ou plusieurs categorieData.CoreData Comment afficher dans UICollectionView en utilisant nsfetchedcontroller

Je dois regrouper les éléments avec quelle catégorie ils se trouvent et afficher une liste de catégories avec les éléments associés. Une categoryData est une section de la vue de collection et une itemData est les éléments de la section.

Exemple

Category1 (section Header) 
ItemA, Item B, ItemC (Items At indexPath) 
Category2 
Item D, Item E, Item A 

J'utilise le code suivant pour mettre en place la nsfetchedcontroller pour y parvenir.

+ (void) 
getFetchedControllerForCategoryDiscoverDelegate:(id<NSFetchedResultsControllerDelegate>)delegate 
            completion:(void (^)(NSFetchedResultsController *controller)) 
                completion { 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"showInDiscover == YES"]; 
     NSFetchedResultsController *controller = [ItemData MR_fetchAllGroupedBy:@"category.order" 
                   withPredicate:predicate 
                    sortedBy:@"category.order" 
                    ascending:YES 
                    delegate:delegate]; 
     completion(controller); 
} 

Mais se bloque avec l'application Terminating suivante en raison d'une exception non interceptée « NSInvalidArgumentException », la raison: « à plusieurs clés pas permis ici »

Comment puis-je changer cela pour obtenir à un groupe par catégories et montrer les éléments qui lui sont associés lorsqu'il y a une relation plusieurs à plusieurs?

+0

Je pense que vous devrez peut-être remplacer la relation many-many en ajoutant une entité intermédiaire (peut-être "ItemInstance"). 'CategoryData' et' ItemData' auraient chacun une relation un-plusieurs à 'ItemInstance'. Votre FRC récupèrerait alors les objets 'ItemInstance', triés et groupés par' category.order'. – pbasdf

Répondre

0
Each section create on fetch result controller: 

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 
{ 
    return 2; 
} 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    NSInteger numberOfRows = 0; 
    if (section==0) 
    { 
     NSArray *sections =[self.sample_fetchedResultsController sections]; 
     id <NSFetchedResultsSectionInfo> sectionInfo = [sections objectAtIndex:0]; 
     numberOfRows = [sectionInfo numberOfObjects]; 
     return numberOfRows; 
    } 
    else 
    { 
     NSArray *sections =[self.fetchedResultsController sections]; 
     id <NSFetchedResultsSectionInfo> sectionInfo = [sections objectAtIndex:0]; 
     numberOfRows = [sectionInfo numberOfObjects]; 
     return numberOfRows; 

    } 
} 

    - (NSFetchedResultsController*)sample_fetchedResultsController 
    { 
     // if allready created return the created controller; 
     if (_sample_fetchedResultsController) return _sample_fetchedResultsController; 

     // create a managed object context 
     NSManagedObjectContext *context = [[CoreDataController sharedInstance] objectContext]; 

     // create fetch request for demo entities 
     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
     NSEntityDescription *entity = [NSEntityDescription entityForName:@"MySample" inManagedObjectContext:context]; 

     [fetchRequest setEntity:entity]; 


     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"friendshipStatus == %@", [NSNumber numberWithInteger:MyCondition]]; 
     [fetchRequest setPredicate:predicate]; 

     // set sort properties 

     NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES selector:@selector(caseInsensitiveCompare:)]; 

     NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
     [fetchRequest setSortDescriptors:sortDescriptors]; 

     [fetchRequest setFetchBatchSize:20]; 

     // create a new NSFetchedResultsController 
     _friends_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                  managedObjectContext:context 
                   sectionNameKeyPath:nil 
                     cacheName:nil]; 
     //             cacheName:@"Root"]; 
     // delegate events to self 
     [_sample_fetchedResultsController setDelegate:self]; 


     return _sample_fetchedResultsController; 
    } 



    Implement fecthedresultcontroller delegates and reload the collection view 
    for example : 
    - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
    { 
     [self.collectionView reloadData]; 
     self.collectionView.scrollEnabled = true; 

    }