核心数据 - 在viewDidLoad之前调用数据源方法

时间:2010-08-14 15:39:57

标签: iphone objective-c cocoa-touch core-data

我注意到我的应用中出现了问题,因为UITableView之前调用viewDidLoad的数据源方法。

问题是UITableView没有正确的行数,它从NSFetchedResultsController得到的行数,但performFetch“函数”被称为在viewDidLoad方法中,由于某种原因在数据源方法之后调用。

以下是两种重要方法的来源:

- (void)viewDidLoad {
    [super viewDidLoad];

 self.tableView.allowsSelectionDuringEditing = NO;
 self.tableView.editing = YES;
 self.title = [NSString stringWithFormat:@"%@", [[game valueForKey:@"title"] description]];

    NSError *error = nil;
    if (![[self fetchedResultsController] performFetch:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo numberOfObjects];
}

如何解决此问题?

2 个答案:

答案 0 :(得分:4)

正常的程序流要求在任何-viewDidLoad数据源方法之前调用UITableView。如果你以相反的顺序得到它们,那么你的代码库中会有一些东西导致它们被乱序调用。

首先,在此问题中显示的两种方法中加上断点,然后确认,它们将被无序调用。

然后,当您在-tableView:numberOfRowsInSection:断点时查看堆栈跟踪,并在-viewDidLoad之前查看为什么被调用。

更新

-viewDidLoad绝对是第一个被调用,如链接所示。当您在该堆栈跟踪中选择[PlayerViewController -viewDidLoad]行时,它所处的代码行是什么?如果它位于[super viewDidLoad]那么你的超类是什么,做什么是-viewDidLoad

答案 1 :(得分:-1)

在我目前的应用中,通用代码流程往往是:

(在父控制器中:)

  • 根据父控制器的相关参数构建NSFetchRequest。
  • 使用NSFetchedResultsController的-performFetch:方法执行提取
  • 如果没有错误,请创建结果视图控制器并将获取的结果控制器与其关联

这种方法避免了您遇到的问题。它还意味着显示结果的视图不需要具有搜索逻辑,并且可以重用以显示不同的结果集(尽管通过传入NSFetchRequest可以实现相同的结果)。