0

我正在使用最新的 SDK 和 XCode 4.5.2 开发一个使用 Core Data 的 iOS 应用程序。

在一个UIViewController我将有两个UITableView,shopsListproductsList. 我想使用Core Data,这是我第一次使用它。因此,我开始使用 Xcode Master Detail 模板,并且在以下位置找到了这段代码MasterViewController.m

- (NSFetchedResultsController *)fetchedResultsController
{
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    // Set the batch size to a suitable number.
    [fetchRequest setFetchBatchSize:20];

    // Edit the sort key as appropriate.
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO];
    NSArray *sortDescriptors = @[sortDescriptor];

    [fetchRequest setSortDescriptors:sortDescriptors];

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    NSError *error = nil;
    if (![self.fetchedResultsController performFetch:&error]) {
         // Replace this implementation with code to handle the error appropriately.
         // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _fetchedResultsController;
}

如果我有这个UIViewController界面:

@interface FirstViewController : UIViewController<CLLocationManagerDelegate, UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate>
{
    CLLocationManager* locationManager;
    BOOL isMenuHidden;
    BOOL isShopsListOpen;
    BOOL isProductsListOpen;
    long int selectedShopRow;
    long int selectedProductRow;
    NSIndexPath* shopCheckedIndexPath;
    NSIndexPath* productCheckedIndexPath;
}

@property (unsafe_unretained, nonatomic) IBOutlet UITableView *shopsList;
@property (unsafe_unretained, nonatomic) IBOutlet UITableView *productsList;

[ ... ]

如果我有一个shop和一个product NSManagedObject

我怎样才能适应- (NSFetchedResultsController *)fetchedResultsController这两个工作UITableView

我可能需要NSFetchedResultsController,不是吗?

4

2 回答 2

3

首先在应用委托中分配 viewController 的 managedObjectContext 。

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) NSFetchedResultsController *productsListFetchedResultsController;
@property (strong, nonatomic) NSFetchedResultsController *shopsListFetchedResultsController;

在您的数据模型中创建 2 个实体,并根据需要在 appdelegate 中填充一些可用数据。

在 viewWillAppear 中,您将 2 个实体获取到 2 个 NSFetchedResultsController,只需在实用程序面板中拖动基本的 fetchResult 块代码并将上下文更改为 self.manageObjectContext,实体名称为关联名称

于 2013-01-23T09:36:39.970 回答
0

解决方案是使用两个NSFetchedResultsController. 我的一个应用程序中有类似的设置。

我建议将获取的结果控制器定义为@property视图控制器的 s。

重要提示:不要忘记检查在您的 FRC 委托回调中调用了哪个控制器,例如controller:didChangeObject:....

于 2013-01-23T12:02:24.647 回答