2012-02-02 7 views
0

私は次の例外の原因を見つけるのに苦労します。それは問題を再現するために繰り返すことができる明確なパターンなしで時折発生します。コアデータがNSInternalInconsistencyExceptionをスローします。「100回の試行後にコンテキストがまだダーティです。

Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'Failed to process pending changes before save. 
The context is still dirty after 100 attempts. 
Typically this recursive dirtying is caused by a bad validation method, 
-willSave, or notification handler.' 

1つのエンティティのみを使用してアプリケーションを格納およびプロセストラッキングデータとのお得な情報:

@interface CSTrackingEntry : NSManagedObject 
    @property (nonatomic, retain) NSString * data; 
    @property (nonatomic, retain) NSDate * dateRecorded; 
@end 

CSTrackingエントリがバッチで、読んで作成され、削除されます。バッチで数十分に1回、数分に1回。通知ハンドラは登録されていません。

UPDATE:スタックは、それが保存されている間あなたがオブジェクトを変更している

2012-02-03 10:26:11.121 BatteryNurse[17162:1803] An uncaught exception was raised 
2012-02-03 10:26:11.121 BatteryNurse[17162:1803] Failed to process pending changes 
before save. The context is still dirty after 100 attempts. Typically this recursive 
dirtying is caused by a bad validation method, -willSave, or notification handler. 
2012-02-03 10:26:11.264 BatteryNurse[17162:1803] *** Terminating app due to uncaught 
exception 'NSInternalInconsistencyException', reason: 'Failed to process pending changes 
before save. The context is still dirty after 100 attempts. Typically this recursive 
dirtying is caused by a bad validation method, -willSave, or notification handler.' 
*** Call stack at first throw: 
(
0 CoreFoundation      0x00007fff8183f784 __exceptionPreprocess + 180 
1 libobjc.A.dylib      0x00007fff89306f03 objc_exception_throw + 45 
2 CoreData       0x00007fff8543a654 -[NSManagedObjectContext(_NSInternalChangeProcessing) _prepareForPushChanges:] + 244 
3 CoreData       0x00007fff8543a0af -[NSManagedObjectContext save:] + 207 
4 BatteryNurse      0x0000000100075ee6 __40-[CSTrackingEntry(Methods) deleteObject]_block_invoke_0 + 102 
5 BatteryNurse      0x000000010007514f __42-[CSCoreDataKernel(CoreData) executeSync:]_block_invoke_0 + 79 
6 libSystem.B.dylib     0x00007fff869bcfbb dispatch_barrier_sync_f + 79 
7 BatteryNurse      0x00000001000750ee -[CSCoreDataKernel(CoreData) executeSync:] + 110 
8 BatteryNurse      0x0000000100075e6f -[CSTrackingEntry(Methods) deleteObject] + 175 
9 CoreFoundation      0x00007fff817ff123 -[NSArray makeObjectsPerformSelector:] + 499 
10 BatteryNurse      0x000000010003a13f -[CSTracker(PrivateMethods) processAndSendBundlesToServer] + 383 
11 BatteryNurse      0x00000001000393a4 __23-[CSTracker flushAsync]_block_invoke_0 + 420 
12 libSystem.B.dylib     0x00007fff869c3d64 _dispatch_call_block_and_release + 15 
13 libSystem.B.dylib     0x00007fff869a28d2 _dispatch_queue_drain + 251 
14 libSystem.B.dylib     0x00007fff869a2734 _dispatch_queue_invoke + 57 
15 libSystem.B.dylib     0x00007fff869a22de _dispatch_worker_thread2 + 252 
16 libSystem.B.dylib     0x00007fff869a1c08 _pthread_wqthread + 353 
17 libSystem.B.dylib     0x00007fff869a1aa5 start_wqthread + 13 

答えて

8

を捕獲しました。 NSManagedObjectContextObjectsDidChange(保存の一部として投稿されますが実際の保存が行われる前に)が表示され、その通知の結果としてオブジェクトが変更された場合、ループを作成します。

-save: CoreDataが最初に-processPendingChanges:を呼び出します(変更がある場合)。そのCoreDataの一部としてNSManagedObjectContextObjectsDidChange通知を送信します。通知が処理されている間に追加のオブジェクトが変更された場合は、-processPendingChanges:を再度呼び出し、通知を再度送信します。保留中の変更がないと、CoreDataはオブジェクトをストアに保持します。保留中の変更が表示され続けると、最終的にはCoreDataが放棄されて印刷されます。

The context is still dirty after 100 attempts. 

これはその要点です。

関連する問題