2011-04-10 151 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