【问题标题】:NSFetchedResultsController Delete AllNSFetchedResultsController 全部删除
【发布时间】:2011-04-10 05:10:39
【问题描述】:

AcaniChat 与原生 iPhone 消息应用程序一样,具有清除所有消息的方法:

for (Message *message in [fetchedResultsController_ fetchedObjects]) {
    [managedObjectContext_ deleteObject:message];
}
if (![managedObjectContext_ save:&error]) {
    // TODO: Handle the error appropriately.
    NSLog(@"Delete message error %@, %@", error, [error userInfo]);
}

但是,只有当有大量消息被删除(足以使某些消息不在屏幕上)时,AcaniChat 才会崩溃并出现错误:

2011-04-10 01:06:17.629 AcaniChat[11129:207] Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  CoreData could not fulfill a fault for '0x4d7d050 <x-coredata://F07CAEF9-5F38-4A1F-BA17-52A3E2E56978/Message/p42>' with userInfo {
    NSAffectedObjectsErrorKey =     (
        "<Message: 0x4d665b0> (entity: Message; id: 0x4d7d050 <x-coredata://F07CAEF9-5F38-4A1F-BA17-52A3E2E56978/Message/p42> ; data: <fault>)"
    );
}
2011-04-10 01:06:17.721 AcaniChat[11129:207] Delete message error Error Domain=NSCocoaErrorDomain Code=133000 "The operation couldn’t be completed. (Cocoa error 133000.)" UserInfo=0x4d9cf70 {NSAffectedObjectsErrorKey=(
    "<Message: 0x4d665b0> (entity: Message; id: 0x4d7d050 <x-coredata://F07CAEF9-5F38-4A1F-BA17-52A3E2E56978/Message/p42> ; data: <fault>)"
), NSUnderlyingException=CoreData could not fulfill a fault for '0x4d7d050 <x-coredata://F07CAEF9-5F38-4A1F-BA17-52A3E2E56978/Message/p42>'}, {
    NSAffectedObjectsErrorKey =     (
        "<Message: 0x4d665b0> (entity: Message; id: 0x4d7d050 <x-coredata://F07CAEF9-5F38-4A1F-BA17-52A3E2E56978/Message/p42> ; data: <fault>)"
    );
    NSUnderlyingException = "CoreData could not fulfill a fault for '0x4d7d050 <x-coredata://F07CAEF9-5F38-4A1F-BA17-52A3E2E56978/Message/p42>'";
}
2011-04-10 01:06:18.036 AcaniChat[11129:207] CoreAnimation: ignoring exception: CoreData could not fulfill a fault for '0x4d7d050 <x-coredata://F07CAEF9-5F38-4A1F-BA17-52A3E2E56978/Message/p42>'

我该如何解决这个问题?

【问题讨论】:

  • 你有NSManagedObjectContextObjectsDidChangeNotification的观察者吗?
  • 请发布您的 NSFetchedResultsControllerDelegate 方法
  • 我通过设置fetchedResultsController_.delegate = nil 解决了这个问题。请参阅下面的答案。谢谢!

标签: ios iphone core-data tableview nsfetchedresultscontroller


【解决方案1】:

我通过设置fetchedResultsController_.delegate = nil 来解决此问题,删除cellMap 中的所有对象(这实际上是UITableView *chatContent 的数据源,因为我将NSDate 对象添加到cellMap 用于时间戳单元格),以及然后,设置fetchedResultsController_.delegate = self 并再次执行获取请求。

NSError *error;
fetchedResultsController.delegate = nil;               // turn off delegate callbacks
for (Message *message in [fetchedResultsController fetchedObjects]) {
    [managedObjectContext deleteObject:message];
}
if (![managedObjectContext save:&error]) {
    // TODO: Handle the error appropriately.
    NSLog(@"Delete message error %@, %@", error, [error userInfo]);
}
fetchedResultsController.delegate = self;              // reconnect after mass delete
if (![fetchedResultsController performFetch:&error]) { // resync controller
    // TODO: Handle the error appropriately.
    NSLog(@"fetchMessages error %@, %@", error, [error userInfo]);
}
[cellMap removeAllObjects];
[chatContent reloadData];

【讨论】:

  • 如果您更新核心数据,您需要使用beginUpdate 冻结表格视图,完成您的更改,然后调用endUpdate,这将阻止表格视图在您更改时尝试重绘自身其基础数据。
  • @TechZen,我试过了,但得到了'NSInternalInconsistencyException', reason: 'Attempt to create two animations for cell'。无论如何,我不希望它被动画化,所以这个解决方案有效。
【解决方案2】:

另外,请查看MagicalRecord。它有一个+truncateAll 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多