更改的核心数据未显示在tableview上

时间:2014-08-19 18:45:37

标签: ios objective-c core-data

我一直坚持调试这个问题几个小时,需要一些帮助。首先,下面是我遇到问题的功能代码:

- (void)addAllHomeworkInstances:(Homework *)homework
{
    // Gets all the subjects that match
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Subject"];
    request.predicate = [NSPredicate predicateWithFormat:@"(name = %@) AND (teacher = %@)", self.subject.name, self.subject.teacher];

    // Finds matches from request
    NSError *error;
    NSArray *matches = [[homework managedObjectContext] executeFetchRequest:request error:&error];
    if (error || !matches) {
        NSLog(@"Error when trying to add homework for all subjects: %@", error);
    }
    else {
        [matches enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            // Adds the homework to each subject
            if ([obj isKindOfClass:[Subject class]]) {
                Subject *eachSubject = (Subject *)obj;

                // Makes sure subject is not the current one since
                if (![eachSubject isEqual:self.subject]) {
                    NSMutableSet *homeworkInSubject = [[NSMutableSet alloc] initWithSet:eachSubject.homework];
                    [homeworkInSubject addObject:homework];
                    eachSubject.homework = homeworkInSubject;
                }
            }
        }];
    }
}

现在问题发生在eachSubject.homework = homeworkInSubject;行上。基本上,我的视图控制器显示给定类的作业,当我们为类添加作业时,会调用此函数。

如果我注释掉上面的行,添加的作业将在当前视图控制器上显示,因为它已添加到课程中。评论行应该做的是通过添加家庭作业来更新其他科目(不是当前的)作业集。当我取消注释该行时,其他主题会在核心数据中更新。

问题是即使当前主题的核心数据得到更新,当前视图控制器也不会显示主题。我试图用performFetch来更新数据,reloadData用于tableview,甚至重新初始化fetchedResultsController但没有任何效果。

我认为更改核心数据是问题的原因,但我通过在if条件中使用以下代码测试了这一点,证明事实并非如此:

if (![eachSubject isEqual:self.subject]) {
    NSMutableSet *homeworkInSubject = [[NSMutableSet alloc] initWithSet:eachSubject.homework];
    eachSubject.homework = homeworkInSubject;
}

所以现在,我完全无助了。我尝试了很多东西,但没有人给我正确的结果。

修改

这是我用来通过初始化fetchResultsController来显示tableview的代码,但我99%肯定这没有问题,因为对上面有问题的行进行评论仍然能正常工作:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self initializeFetchResultsController];
}

// Initializes the NSFetchedResultsController to the following request
- (void)initializeFetchResultsController
{
    // Makes a request for the given entity
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Homework"];
    request.predicate = [NSPredicate predicateWithFormat:@"inClass = %@", self.subject];
    request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"dueDate"
                                                              ascending:NO],
                                [NSSortDescriptor sortDescriptorWithKey:@"title"
                                                              ascending:YES
                                                               selector:@selector(localizedStandardCompare:)]];
    // Creates a fetchedResultsController
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                        managedObjectContext:[self.subject managedObjectContext]
                                                                          sectionNameKeyPath:nil
                                                                                   cacheName:nil];
}

1 个答案:

答案 0 :(得分:1)

您何时告诉tableview重新加载数据?提取,枚举和插入的顺序不是串行的(您使用块),因此它们会在各种不同的时间发生。我假设您正在做类似的事情:

[self addAllHomeWorkInstances:homework];
[self.tableView reloadData];

这可能不会起作用,因为您无法保证完成更新Subject对象。您可以尝试的一件事是在延迟后重新加载数据,看看是否是问题。更好的方法是添加一个完成块,以便你有类似

的东西
[self addAllHomeworkInstances:homework completion: ^{
    [self.tableView reloadData];
}];

每次在enumerateObjectsUsingBlock块内调用完成块。

我们弄明白后编辑:

问题似乎是你的对象之间的关系。家庭作业和主题必须是多对多关系,而家庭作业在发布问题时只属于一个主题。因此,当其他科目接管作业时,它已从当前科目中删除。