исключение при попытке сохранить CoreData

#iphone #core-data

#iPhone #core-data

Вопрос:

 NSError *error;
if (managedObjectContext != nil) {
    if ([managedObjectContext hasChanges] amp;amp; ![managedObjectContext save:amp;error]) {
        DLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}
  

при сохранении некоторых элементов с приведенным выше кодом в CoreDate я получаю следующее исключение. managedObjectContext содержит 50 неразрешенных удалений и 700 неразрешенных вставок. очевидно, что у него проблема с удалениями. есть какие-нибудь идеи о том, как его отследить?

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSSet0 removeObject:]: unrecognized selector sent to instance 0x61a4840'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x018d45a9 __exceptionPreprocess   185
    1   libobjc.A.dylib                     0x01a28313 objc_exception_throw   44
    2   CoreFoundation                      0x018d60bb -[NSObject(NSObject) doesNotRecognizeSelector:]   187
    3   CoreFoundation                      0x01845966 ___forwarding___   966
    4   CoreFoundation                      0x01845522 _CF_forwarding_prep_0   50
    5   CoreData                            0x00ffa31d -[NSManagedObject(_NSInternalMethods) _excludeObject:fromPropertyWithKey:andIndex:]   397
    6   CoreData                            0x00fef7d1 -[NSManagedObject(_NSInternalMethods) _maintainInverseRelationship:forProperty:oldDestination:newDestination:]   449
    7   CoreData                            0x01043b55 -[NSManagedObject(_NSInternalMethods) _propagateDelete:]   1541
    8   CoreData                            0x00ffa02a -[NSManagedObject(_NSInternalMethods) _propagateDelete]   42
    9   CoreData                            0x00ff9e53 -[NSManagedObjectContext(_NSInternalChangeProcessing) _propagateDeletesUsingTable:]   515
    10  CoreData                            0x00ff9c12 -[NSManagedObjectContext(_NSInternalChangeProcessing) _processDeletedObjects:]   146
    11  CoreData                            0x00fecba8 -[NSManagedObjectContext(_NSInternalChangeProcessing) _propagatePendingDeletesAtEndOfEvent:]   104
    12  CoreData                            0x00fb8982 -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:]   754
    13  CoreData                            0x00ff2715 -[NSManagedObjectContext save:]   149
    14  Ace Metrix iPad                     0x00075153  [CoreDataHelper saveCoreDate:]   82
    15  Ace Metrix iPad                     0x0007a790 -[WSBreakingAds platformRequestFinishedWhidType:withResponse:]   772
    16  Ace Metrix iPad                     0x00077c6d -[PlatformContainer operation:completedWithResponse:withNSManagedObjectContext:]   1042
    17  Ace Metrix iPad                     0x000401ec -[WebServiceAuthServiceSoapBinding_getPartialAdvertisementsAfterDate connectionDidFinishLoading:]   1209
    18  Foundation                          0x00182112 -[NSURLConnection(NSURLConnectionReallyInternal) sendDidFinishLoading]   108
    19  Foundation                          0x0018206b _NSURLConnectionDidFinishLoading   133
    20  CFNetwork                           0x00dec492 _ZN19URLConnectionClient23_clientDidFinishLoadingEPNS_26ClientConnectionEventQueueE   220
    21  CFNetwork                           0x00eb76e1 _ZN19URLConnectionClient26ClientConnectionEventQueue33processAllEventsAndConsumePayloadEP20XConnectionEventInfoI12XClientEvent18XClientEventParamsEl   293
    22  CFNetwork                           0x00de2c84 _ZN19URLConnectionClient13processEventsEv   100
    23  CFNetwork                           0x00de2ad3 _ZN17MultiplexerSource7performEv   251
    24  CoreFoundation                      0x018b58ff __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__   15
    25  CoreFoundation                      0x0181388b __CFRunLoopDoSources0   571
    26  CoreFoundation                      0x01812d86 __CFRunLoopRun   470
    27  CoreFoundation                      0x01812840 CFRunLoopRunSpecific   208
    28  CoreFoundation                      0x01812761 CFRunLoopRunInMode   97
    29  GraphicsServices                    0x01e3e1c4 GSEventRunModal   217
    30  GraphicsServices                    0x01e3e289 GSEventRun   115
    31  UIKit                               0x003eec93 UIApplicationMain   1160
    32  Ace Metrix iPad                     0x00002814 main   102
    33  Ace Metrix iPad                     0x000027a5 start   53
)
terminate called after throwing an instance of 'NSException'
  

Ответ №1:

Вы вызываете removeObject: неизменяемый экземпляр NSSet . Убедитесь, что набор, с которым вы работаете, является экземпляром NSMutableSet . Нам могло бы помочь, если бы вы могли опубликовать код, в котором вы фактически выполняете удаления.

Комментарии:

1. на самом деле это код, который вызывается removeObject: . функции сохранения выполняют вызов где-то внутри.

2. хорошо .. итак, как вы выполняете удаление? Просматриваете ли вы какие-либо взаимосвязи в процессе?

3. объекты помечаются для удаления с помощью [managedObjectContext DeleteObject: object]; затем фактически удаляются в команде сохранения. объекты находятся в NSArray, когда для них вызывается эта функция.

4. Сможете ли вы опубликовать код, в котором вы фактически перебираете свою коллекцию объектов и вызываете [managedObjectContext DeleteObject: object]; ? Спасибо.

5. оказывается, там, где некоторые NSSets в моей модели. я заменил их все на NSMutableSets, и теперь приложение работает нормально.