【问题标题】:controllerWillChangeContent not being called when deleting all entries of an entity删除实体的所有条目时未调用 controllerWillChangeContent
【发布时间】:2015-03-08 03:55:44
【问题描述】:

以下是我为 tableView“重置”按钮实现的方法。我已经验证实体中的条目正在被删除,但是在删除后我的 controllerWillChangeContent 没有被调用。有没有办法手动调用这个方法?

CoreDataStack *coreDataStack = [[CoreDataStack alloc]init];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"FoodEntry"];
[fetchRequest setIncludesPropertyValues:NO];

NSError *error;
NSArray *fetchedObjects = [coreDataStack.managedObjectContext executeFetchRequest:fetchRequest error:&error];

for (NSManagedObject *object in fetchedObjects)
{
    [coreDataStack.managedObjectContext deleteObject:object];
}

error = nil;
[coreDataStack.managedObjectContext save:&error];

编辑:FRC 代码

- (NSFetchedResultsController *)fetchedResultsController {
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    CoreDataStack *coreDataStack = [CoreDataStack defaultStack];
    NSFetchRequest *fetchRequest = [self entryListFetchRequest];

    _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:coreDataStack.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    _fetchedResultsController.delegate = self;
    return _fetchedResultsController;
}

【问题讨论】:

  • 我怀疑您的删除代码使用的 managedObjectContext 与您获取的结果控制器不同。请您出示 FRC 的代码。
  • 另外,这段代码什么时候运行,表视图使用什么获取请求
  • 你是对的,它与我的 FRC 没有链接只是不知道如何解决这个问题,对编码来说还是新手。当用户按下“重置”按钮时调用它。整体被删除,我只需要表格视图在按下时适当更新。以上是我在“编辑”下的 FRC 代码。谢谢

标签: objective-c uitableview core-data delete-row


【解决方案1】:

无法确定,不知道 CoreDataStack 的内部结构,但看起来您正在使用两个不同的堆栈:请注意您的代码使用:

CoreDataStack *coreDataStack = [[CoreDataStack alloc] init];

而 FRC 使用:

CoreDataStack *coreDataStack = [CoreDataStack defaultStack];

您可以更改您的代码以使用与 FRC 相同的代码(defaultStack 可能是一个单例,并且无论何时调用它都会返回相同的堆栈)。但是如果 FRC 与删除代码在同一个类中,那么只使用 FRC 的 managedObjectContext 会更容易(也更清晰):

NSManagedObjectContext *context = self.fetchedResultsController.managedObjectContext
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"FoodEntry"];
[fetchRequest setIncludesPropertyValues:NO];

NSError *error;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *object in fetchedObjects)
{
    [context deleteObject:object];
}
error = nil;
[context save:&error];

顺便说一下,检查executeFetchRequest:save: 是否返回错误总是值得的。

【讨论】:

  • 啊!是的,没错,我在自己的类文件中将我的 coreDataStack 设置为单例。将其更改为 [coreDataStack defaultStack] 修复了它。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 2010-11-19
相关资源
最近更新 更多