我一直坚持调试这个问题几个小时,需要一些帮助。首先,下面是我遇到问题的功能代码:
- (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];
}
答案 0 :(得分:1)
您何时告诉tableview重新加载数据?提取,枚举和插入的顺序不是串行的(您使用块),因此它们会在各种不同的时间发生。我假设您正在做类似的事情:
[self addAllHomeWorkInstances:homework];
[self.tableView reloadData];
这可能不会起作用,因为您无法保证完成更新Subject对象。您可以尝试的一件事是在延迟后重新加载数据,看看是否是问题。更好的方法是添加一个完成块,以便你有类似
的东西[self addAllHomeworkInstances:homework completion: ^{
[self.tableView reloadData];
}];
每次在enumerateObjectsUsingBlock块内调用完成块。
我们弄明白后编辑:
问题似乎是你的对象之间的关系。家庭作业和主题必须是多对多关系,而家庭作业在发布问题时只属于一个主题。因此,当其他科目接管作业时,它已从当前科目中删除。