versiones guia español descargar actualizar macos cocoa core-data

macos - guia - excepción de guardado de hijo/padre de datos principales



qgis manual (2)

Sus identificadores de var son realmente confusos. Los nombres como parentContext, child Context, rootContext, etc., ¿son complicados?

De todos modos, el problema probablemente no sea la operación de guardado. En una primera vista, parece que cambiaste la relación de un objeto por otro objeto, pero el otro objeto ya no existe. Esto puede suceder si el otro objeto tiene una falla en el contexto secundario y se elimina en la tienda. (Probablemente porque el contexto principal eliminó el objeto y guardó su estado).

Me bloqueé (probablemente mientras el padre moc guardaba:

así es como se creó moc (parent):

if (_managedObjectContextInMemoryForDynamicInformation) return _managedObjectContextInMemoryForDynamicInformation; NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinatorInMemoryForDynamicInformation]; if (!coordinator) { NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setValue:@"Failed to initialize the store" forKey:NSLocalizedDescriptionKey]; [dict setValue:@"There was an error building up the data file." forKey:NSLocalizedFailureReasonErrorKey]; NSError *error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict]; [[NSApplication sharedApplication] presentError:error]; return nil; } _managedObjectContextInMemoryForDynamicInformation = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; [_managedObjectContextInMemoryForDynamicInformation setPersistentStoreCoordinator:coordinator]; [_managedObjectContextInMemoryForDynamicInformation setUndoManager:nil]; return _managedObjectContextInMemoryForDynamicInformation;

niño:

AppDelegate *delegateMain = (AppDelegate *)[[NSApplication sharedApplication] delegate]; _mocInMemoryForDynamicInformation = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; [_mocInMemoryForDynamicInformation setUndoManager:nil]; _mocInMemoryForDynamicInformation.parentContext = delegateMain.managedObjectContextInMemoryForDynamicInformation;

así es como ahorro:

-(void) finalSaveMocInMemoryForDynamicInformation; { [_mocInMemoryForDynamicInformation performBlock:^{ // do something that takes some time asynchronously using the temp context // push to parent NSError *error; if ([_mocInMemoryForDynamicInformation save:&error]) { AppDelegate *delegateMain = (AppDelegate *)[[NSApplication sharedApplication] delegate]; // save parent to disk asynchronously [delegateMain.managedObjectContextInMemoryForDynamicInformation performBlock:^{ @try { NSError *error; if (![delegateMain.managedObjectContextInMemoryForDynamicInformation save:&error]) { [self logError:error]; } } @catch (NSException *exception) { NSLog(@"ERROR:%@:%@ exception->%@ inside managedObjectContextInMemoryForDynamicInformation",[self class], NSStringFromSelector(_cmd),exception); //[[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:moc]; return ; } }]; } else [self logError:error]; }]; }

Información específica de la aplicación: * Aplicación de finalización debido a una excepción no detectada ''NSObjectInaccessibleException'', razón: ''CoreData no pudo cumplir un error para'' 0x7fd8a71d87a0 '''' abort () llamado terminar llamado lanzar una excepción

Application Specific Backtrace 1: 0 CoreFoundation
0x00007fff86e6f0a6 __exceptionPreprocess + 198 1 libobjc.A.dylib
0x00007fff849353f0 objc_exception_throw + 43 2 CoreData
0x00007fff8737eec4 _PFFaultHandlerLookupRow + 1348 3 CoreData
0x00007fff8737e61f _PF_FulfillDeferredFault + 239 4 CoreData
0x00007fff873892cd _PF_ManagedObject_WillChangeValueForKeyIndex + 77 5 CoreData 0x00007fff8738cc51 _sharedIMPL_setvfk_core + 129 6 CoreData 0x00007fff873a4eaa - [NSManagedObject (_NSInternalMethods) _didChangeValue: forRelationship: nombre: withInverse:] + 1,434 7 Fundación 0x00007fff878fe860 NSKeyValueNotifyObserver + 390 8 Fundación
0x00007fff87900279 NSKeyValueDidChange + 456 9 Fundación
0x00007fff878bb7df - [NSObject (NSKeyValueObserverNotification) didChangeValueForKey:] + 130 10 CoreData
0x00007fff873898c1 - [NSManagedObject didChangeValueForKey:] + 113 11 CoreData 0x00007fff873e566d - [NSManagedObject (_NSInternalMethods) _updateFromRefreshSnapshot: includingTransients:] + 685 12 CoreData 0x00007fff873b0969 - [NSManagedObjectContext (_NestedContextSupport) _copyChildObject: toParentObject: fromChildContext:] + 121 13 CoreData 0x00007fff873b0505 - [NSManagedObjectContext ( _NestedContextSupport) _parentProcessSaveRequest: InContext: error:] + 629 14 CoreData 0x00007fff873df72a __82- [NSManagedObjectContext (_NestedContextSupport) ExecuteRequest: withContext: error:] _ block_invoke_0 + 634 15 libdispatch.dylib 0x00007fff8aad6a2d _dispatch_barrier_sync_f_slow_invoke + 77 16 libdispatch.dylib 0x00007fff8aad10b6 _dispatch_client_callout + 8 17 libdispatch. dylib 0x00007fff8aad60c8 _dispatch_main_queue_callback_4CF + 275 18 CoreFoundation 0x00007fff86e110fe __CFRunLoopRun + 1614 19 CoreFoundation 0x00007fff86e106b2 CFRunLoopRunSpecific + 290 20 HIToolbox
0x00007fff89d950a4 RunCurrentEventLoopInMode + 209 21 HIToolbox
0x00007fff89d94e42 ReceiveNextEventCommon + 356 22 HIToolbox
0x00007fff89d94cd3 BlockUntilNextEventMatchingListInMode + 62 23 AppKit 0x00007fff8ffcd613 _DPSNextEvent + 685 24 AppKit 0x00007fff8ffcced2 - [NSApplication nextEventMatchingMask: untilDate: inMode: dequeue:] + 128 25 AppKit 0x00007fff8ffc4283 - [NSApplication RUN] + 517 26 AppKit 0x00007fff8ff68cb6 NSApplicationMain + 869 27 callsfreecall
0x000000010e6ab472 main + 34 28 libdyld.dylib
0x00007fff858a47e1 start + 0 29 ???
0x0000000000000002 0x0 + 2


Por ahora, encontré la solución de ese bloqueo.

Se produjo un bloqueo en ese código:

[_mocInMemoryForDynamicInformation obtainPermanentIDsForObjects:@[session] error:&error];

Este es un error conocido en Apple, donde no puedo obtener el ID permanente. Si trato de hacerlo en el contexto secundario, guardar es un producto que se cuelga.

Así es como lo resuelvo:

[_mocInMemoryForDynamicInformation.parentContext obtainPermanentIDsForObjects:@[session] error:&error];

Esta solución simple resuelve todos los problemas (no puedo explicar cómo pero esto es trabajo).