再次执行获取后是否重新加载了表视图?
这对我有用:
self.fetchedResultsController = nil;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Error in refetch: %@",[error localizedDescription]);
abort();
}
[self.tableView reloadData];
UPDATE
获取的结果控制器正在观察事物对象的变化,而不是域对象。由于我们正在更改域对象上的帐户,因此获取的结果控制器没有更新是有道理的(新事物除外)。
理想的解决方案是告诉托管对象上下文或获取的结果控制器哪些确切的事物已经“改变”(循环在域中先前拥有帐户的事物上),但这仍然是一个手动过程。
另一种方法是再次执行提取并重新加载对我有用的表。
我根据您的描述创建了这个模型:
帐号 <---> 域 <--->> 东西
为了测试这一点,我在域域一中创建了事物“一”和“二”,在域域二中创建了事物“三”、“四”和“五”。domainOne 有帐户,而 domainTwo 没有帐户。
当应用程序加载时,表格视图按预期显示事物“一”和“二”。
当我点击“更改”时,为 domainTwo 分配了帐户,并且 domainOne 失去了其帐户。此外,在 domainTwo 中创建了一个名为“Six”的新事物。
事物“六”与“一”和“二”一起出现,即使它们不再满足谓词。这与您描述的问题相符。
然后,我点击“重新获取”,表格重新加载“三”、“四”、“五”和“六”。
这是相关的视图控制器代码:
- (void)addTestData {
account = [NSEntityDescription insertNewObjectForEntityForName:@"Account" inManagedObjectContext:self.managedObjectContext];
domainOne = [NSEntityDescription insertNewObjectForEntityForName:@"Domain" inManagedObjectContext:self.managedObjectContext];
domainTwo = [NSEntityDescription insertNewObjectForEntityForName:@"Domain" inManagedObjectContext:self.managedObjectContext];
[domainOne setValue:account forKey:@"domainCurrentAccount"];
NSArray *thingNames = [NSArray arrayWithObjects:@"One", @"Two", @"Three", @"Four", @"Five", nil];
for (NSString *name in thingNames) {
NSManagedObject *thing = [NSEntityDescription insertNewObjectForEntityForName:@"Thing" inManagedObjectContext:self.managedObjectContext];
[thing setValue:name forKey:@"thingName"];
if (name == @"One" || name == @"Two") {
[thing setValue:domainOne forKey:@"thingDomain"];
} else {
[thing setValue:domainTwo forKey:@"thingDomain"];
}
}
}
- (void)change {
[domainTwo setValue:account forKey:@"domainCurrentAccount"];
[domainOne setValue:nil forKey:@"domainCurrentAccount"];
NSManagedObject *thing = [NSEntityDescription insertNewObjectForEntityForName:@"Thing" inManagedObjectContext:self.managedObjectContext];
[thing setValue:@"Six" forKey:@"thingName"];
[thing setValue:domainTwo forKey:@"thingDomain"];
}
- (void)refetch {
self.fetchedResultsController = nil;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Error in refetch: %@",[error localizedDescription]);
abort();
}
[self.tableView reloadData];
}
- (void)viewDidLoad {
[super viewDidLoad];
UIBarButtonItem *changeButton = [[UIBarButtonItem alloc] initWithTitle:@"Change" style:UIBarButtonItemStyleBordered target:self action:@selector(change)];
self.navigationItem.leftBarButtonItem = changeButton;
[changeButton release];
UIBarButtonItem *refetchButton = [[UIBarButtonItem alloc] initWithTitle:@"Refetch" style:UIBarButtonItemStyleBordered target:self action:@selector(refetch)];
self.navigationItem.rightBarButtonItem = refetchButton;
[refetchButton release];
[self addTestData];
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}