Определите массив массивов в NSFetchedResultsController
Я создал код из учебника, который нашел в книге. Это работает, и я могу успешно отобразить мои данные из CoreData в табличном представлении. Теперь я хочу идентифицировать данные / объект, которые возвращает fetchRequest. Я чувствую себя таким тупым, потому что не могу понять синтаксис достаточно, чтобы изолировать мой объект, содержащий мой массив данных. Это фрагмент кода, который мне трудно понять:
- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Sessions" inManagedObjectContext:_context];
[fetchRequest setEntity:entity];
//NSLog(@"Entity is set to: %@", entity);
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"refid" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
//[fetchRequest setFetchBatchSize:20];
NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_context sectionNameKeyPath:nil cacheName:@"Root"];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[_fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
Sessions *info = [_fetchedResultsController objectAtIndexPath:indexPath];
//Format cell data ready to be displayed
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"EE, dd LLL yyyy"];
NSString *dateString = [dateFormat stringFromDate:info.date];
NSNumber *dist1Nbr = info.dist1;
int dist1Int = [dist1Nbr integerValue];
float distIntKorM = ([dist1Nbr integerValue])/1000;
NSString *dist1StrMeters = [[NSString alloc] initWithFormat:@"%i", dist1Int];
NSString *dist1StrKorM = [[NSString alloc] initWithFormat:@"%.01f", distIntKorM];
//Select image to display
if ([info.sport isEqualToString:@"Run"]) {
UIImage *image = [UIImage imageNamed:@"trainers-15x10.png"];
cell.imageView.image = image;
cell.textLabel.text = [[NSString alloc] initWithFormat:@"%@: (%@),", dateString, info.sport];
cell.detailTextLabel.text = [[NSString alloc] initWithFormat:@"Type: %@, Dist: %@", info.sessiontype, dist1StrKorM];
} else if ([info.sport isEqualToString:@"Other"]) {
UIImage *image = [UIImage imageNamed:@"weights-15x10.png"];
cell.imageView.image = image;
cell.textLabel.text = [[NSString alloc] initWithFormat:@"%@: (%@),", dateString, info.sport];
cell.detailTextLabel.text = [[NSString alloc] initWithFormat:@"Type: %@, Dist: %@", info.sessiontype, dist1StrKorM];
}
}
Если кто-нибудь может мне помочь, это будет очень цениться.
2 ответа
Вы можете получить доступ к массиву NSFetchedResultsSectionInfo
объекты по вызову:
NSArray *sections = _fetchedResultsController.sections;
Каждый из этих объектов представляет собой раздел в вашей таблице. Для данного раздела вы можете сделать что-то вроде:
id<NSFetchedResultsSectionInfo>section = sections[0];
NSArray *objects = section.objects;
чтобы получить доступ к управляемым объектам в этом разделе. Или, если у вас есть индексный путь, вы можете получить доступ к связанному объекту напрямую, выполнив:
NSManagedObject *object = [_fetchedResultsController objectAtIndexPath:indexPath];
В обратном порядке:
NSIndexPath *indexPath = [_fetchedResultsController indexPathForObject:object];
Это то, что вы ищете?
Обновить
Забыли это. Как Хуан предложил ниже, вы можете получить доступ ко всем извлеченным объектам с помощью:
NSArray *allObjects = _fetchedResultsController.fetchedObjects;
Из кода, который вы разместили, NSFetchedresultsController собирается вернуть все объекты класса Sessions, упорядоченные по убыванию по ключу 'refid'. NSFetchedResultsCOntroller используется вместе с UITableViewController для отображения результатов запроса выборки в хранилище базовых данных.
Однако, если вы хотите просто получить все объекты в массиве без использования табличного представления, вы можете сделать следующее, например, в viewWillAppear:
if (self.managedObjectContext) {
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Sessions"];
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"refid" ascending:NO];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
[self.fetchedResultsController performfetch];
NSArray *results = [self.fetchedResultsController fetchedObjects]; // an array of Sessions objects ordered descending by refid key
for (Sessions *sessions in results) {
NSLog(@"Sessions = %@", sessions);
}
}
Вы должны убедиться, что NSManagedContext правильно инициализирован, прежде чем ничего не будет отображаться.