我应该把我的NSFetchedResultsControllerDelegate放在哪里?

时间:2011-04-04 17:35:27

标签: iphone cocoa-touch uitableview core-data nsfetchedresultscontroller

我正在自学编程,方法是创建一个简单的核心数据深入分析应用程序,其中UINavigationController选择一个祖父母实体来查看父母UITableView,然后选择一个父代看到孩子们。每当用户选择一个项目时,我都会使用属性将NSManagedObjectContextNSFetchedResultsController移交给下一个视图。每个视图控制器都是UITableViewController,它们都符合NSFetchedResultsControllerDelegate协议。

这很好用,但意味着每个视图控制器都在实现委托方法等,这似乎效率低下。

为了简化应用程序,我的所有视图控制器都会引用一个NSFetchedResultsControllerDelegate会更好吗?那个最好的地方在哪里 - 应用代表?

谢谢!

--------------------------- EDIT ---------------- ------------

我正试图让GorillaPatch的答案在下面工作。在我的子视图中,我有这个方法,它是模式“添加视图控制器”的委托方法:

- (void)addingViewController:(AddingViewController *)addingViewController didAdd:(NSString *)itemAdded
{   
    NSManagedObjectContext *context = [parent managedObjectContext];
    Child *newChild = [NSEntityDescription insertNewObjectForEntityForName:@"Child" inManagedObjectContext:context];

    [self.children insertObject:newChild atIndex:0];

    newChild.name = itemAdded;
    newChild.dateStamp = [NSDate date];


    // Save the context.
    NSError *error = nil;
    if (![context save:&error])
    {
        // Handle The Error.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    [self dismissModalViewControllerAnimated:YES];
}

头文件中有以下内容:

@property (nonatomic, retain) Trip *trip;
@property (nonatomic, retain) Checklist *checklist;
@property (nonatomic, retain) NSMutableArray *checklists;

5 个答案:

答案 0 :(得分:3)

以我的拙见,绝对没有。通常,每个视图都需要不同的NSFetchedResultsControllerDelegate实现,因为您在每个委托方法中实际执行的操作可能会有所不同(除非您的应用程序非常简单)。

答案 1 :(得分:2)

不,通过编写实现NSFetchedResultsControllerDelegate(可能是UITableViewController子类)的基类并包含NSFetchedResultsController实例,然后在任何需要的地方扩展基类,你可能会更好。

如果你有多个级别可以向下钻取,最可能的情况是你的实现中唯一会改变的是用于获取NSFetchedResultsController实例的谓词。

答案 2 :(得分:2)

我建议为每个UITableView使用FetchedResultsController实例。原因是FRC响应数据变化的方式。你可以在这里阅读FRC:http://developer.apple.com/library/ios/#documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html

  

如果为fetched设置委托   结果控制器,控制器   注册以接收更改   来自其托管对象的通知   上下文。上下文中的任何变化   这会影响结果集或部分   信息被处理和   结果会相应更新。该   控制器何时通知代表   结果对象更改位置或何时更改   部分被修改(见   NSFetchedResultsControllerDelegate)。   您通常使用这些方法   更新表格视图的显示。

此外,如果按照说法进行深入研究,每个新的子视图应该是一组独特的数据,不允许您共享FRC。

答案 3 :(得分:2)

为什么要将NSFetchedResultsControllerNSManagedObjectContext(MOC)移交给子视图控制器或详细视图控制器?我强烈建议在详细视图控制器上定义属性,这是您要显示的对象。

例如,如果您有一个从CoreData获取的食谱列表,并且您在食谱上有选项卡,那么您将有一个详细视图控制器滑动,其中将显示食谱的详细信息。我建议通过拥有一个具有currentRecipe实例变量的UIViewController子类来实现它。然后,您可以将此实例变量设置为您在列表中选中的配方,然后将视图控制器推送到堆栈中。

通过这样做,你可以非常好地解耦你的用户界面。这使得这个视图控制器可以在整个程序中重用。

更新

由于我们冗长的讨论,如果您想了解更多关于MVC设计模式以及如何在iPhone上实现向下钻取导航,我想提供更多可能有用的材料。

  1. 示例代码:查看在WWDC09和WWDC10上演示的iPhoneCoreDataRecipes app,以说明如何实现一组详细视图控制器以及它们如何相互交互。 / LI>
  2. WWDC会话视频:有一些WWDC会话视频可能会有所帮助:
    • WWDC10:会话116 - 适用于iPhone OS的模型 - 视图 - 控制器
    • WWDC09:第125课 - 有效的iPhone应用程序架构

答案 4 :(得分:1)

扩展之前的答案:

NSFetchedResultsController是Model-View-Controller应用程序设计的控制器层的一部分。设计的名称应该是Model-Controller-View,因为控制器在数据模型(在本例中为Core Data)和视图之间进行调解。因此,FRC必须根据每个特定的tableview的需求进行定制,其中的数据是获取,分类和管理的。它正确地属于tableview的datasource委托,它通常只是tableview控制器对象。

您正在考虑的设计只有在每个表使用具有完全相同排序顺序的完全相同的实体时才有效。在那种情况下,为什么要烦扰多个表?