Базовые данные выдают NSInternalInconsistencyException «Контекст все еще грязный после 100 попыток». - PullRequest
0 голосов
/ 02 февраля 2012

Я изо всех сил пытаюсь найти причину следующего исключения. Время от времени это происходит без четкой картины, которую я могу повторить, чтобы воспроизвести проблему.

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

Приложение хранит и обрабатывает данные отслеживания и работает только с одним объектом:

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

Записи CSTracking считываются, создаются и удаляются партиями. Несколько штук в партии, раз в пару минут. Обработчики уведомлений не зарегистрированы.

ОБНОВЛЕНИЕ: стек записан

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

1 Ответ

9 голосов
/ 03 февраля 2012

Вы изменяете объект, пока он сохраняется. Если вы наблюдаете NSManagedObjectContextObjectsDidChange (который будет опубликован как часть сохранения, но до фактического сохранения), и вы изменили объекты в результате этого уведомления, вы создадите цикл:

Когда вы звоните -save: CoreData сначала вызывает -processPendingChanges: (если есть изменения). Как часть этого CoreData отправляет уведомление NSManagedObjectContextObjectsDidChange. Если дополнительные объекты изменились во время обработки уведомления, он снова вызывает -processPendingChanges:, отправляет уведомление снова и т. Д. Если ожидающие изменения отсутствуют, CoreData сохраняет объекты в хранилище. Если ожидающие изменения продолжат появляться, CoreData в конечном итоге сдастся и напечатает

The context is still dirty after 100 attempts.

В этом суть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...