我在我的购物车应用程序中的核心数据模型中设置了以下关系。
Menu
->> Product
<<- Cart
(见下图)。
以及具有以下代码的 Objective-C 类别:
+ (Cart *)addProductToCartWithProduct:(Product *)product inManagedObjectContext:(NSManagedObjectContext *)context
{
Cart *cart = [NSEntityDescription insertNewObjectForEntityForName:@"Cart" inManagedObjectContext:context];
NSManagedObjectID *retID = [product objectID];
[(Product *)[context objectWithID:retID] setInCart:cart];
[cart addProductsObject:(Product *)[context objectWithID:retID]];
return cart;
}
当用户在应用程序中按下“添加到购物车”按钮时,会触发此方法(上述方法)。我现在想在“购物车”所在的其他类中获取这些产品(由用户添加到购物车中)。我希望这些产品在我UITableView
的课堂上展示,因此我使用 FRC。但我不知道如何获取关系并因此展示产品。我将如何做到这一点?
我现在有以下代码。
- (void)loadCart
{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.entity = [NSEntityDescription entityForName:@"Cart" inManagedObjectContext:_theManagedObjectContext];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:YES];
fetchRequest.sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[NSFetchedResultsController deleteCacheWithName:@"cartproducts"];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_theManagedObjectContext sectionNameKeyPath:nil cacheName:@"cartproducts"];
_fetchedResultsController.delegate = self;
NSError *error = nil;
if (![_fetchedResultsController performFetch:&error]) {
NSLog(@"Fetch Failed");
}
}
我的UITableview
cellForRowAtIndexPath:
方法。
- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *plainCellIdentifier = @"OrderCell";
ProductsCell *cell = (ProductsCell *)[aTableView dequeueReusableCellWithIdentifier:plainCellIdentifier];
if (!cell) {
cell = [[ProductsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:plainCellIdentifier];
}
Cart *ret = (Cart *)[self.fetchedResultsController objectAtIndexPath:indexPath];
// How to show the product names using the relationship?
cell.title = ret.products ??;
[cell setNeedsDisplay];
return cell;
}