2011-04-10 61 views
2

AcaniChat,像原生iPhone消息应用程序中,必须清除所有消息的方法:NSFetchedResultsController删除所有

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>' 

我该如何解决这个问题?

+0

你有'NSManagedObjectContextObjectsDidChangeNotification'的观察者吗? – Robert 2011-04-10 08:42:47

+0

请发布您的NSFetchedResultsControllerDelegate方法 – 2011-04-10 14:03:49

+0

我通过设置'fetchedResultsController_.delegate = nil'解决了这个问题。请参阅下面的答案。谢谢! – ma11hew28 2011-04-10 19:42:05

回答

4

我通过设置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]; 
+1

如果您要更新Core Data,则需要使用'beginUpdate'冻结tableview,完成更改,然后调用'endUpdate',以防止tableview在更改其基础数据时尝试重绘本身。 – TechZen 2011-04-11 00:42:13

+0

@TechZen,我试过,但得到了'NSInternalInconsistencyException',原因:'试图为单元格创建两个动画'。无论如何,我不希望它是动画,所以这个解决方案的工作。 – ma11hew28 2011-04-13 19:49:38