Core Data NSValidationErrorObject, provoca crash

Estoy trabajando en una aplicación donde tengo usuarios, cada usuario tiene una relación de muchos a muchos con los seguidores. Actualmente tengo algunos problemas para save nuevos objects de usuario. La aplicación se cierra en managedObjectContext save . Obtuve el siguiente error:

 Unresolved error Error Domain=NSCocoaErrorDomain Code=1560 "The operation couldn't be completed. (Cocoa error 1560.)" UserInfo=0x8580640 {NSDetailedErrors=( "Error Domain=NSCocoaErrorDomain Code=1550 \"The operation couldn\U2019t be completed. (Cocoa error 1550.)\" UserInfo=0x85820c0 {NSValidationErrorObject=<User: 0x7575870> (entity: User; id: 0x75757c0 NSValidationErrorKey=followers, NSLocalizedDescription=The operation couldn\U2019t be completed. (Cocoa error 1550.), NSValidationErrorValue=Relationship 'followers' on managed object (0x7575870) <User: 0x7575870> (entity: User; id: 0x75757c0 "Error Domain=NSCocoaErrorDomain Code=1550 \"The operation couldn\U2019t be completed. (Cocoa error 1550.)\" UserInfo=0x8586830 {NSValidationErrorObject=<User: 0x7571ec0> (entity: User; id: 0x7571f00 "Error Domain=NSCocoaErrorDomain Code=1550 \"The operation couldn\U2019t be completed. (Cocoa error 1550.)\" UserInfo=0x858e820 {NSValidationErrorObject=<User: 0x7573120> (entity: User; id: 0x7573160 [...] 

Realmente no puedo entender qué está causando este locking. Mi relación se ve así:

introduzca la descripción de la imagen aquí

introduzca la descripción de la imagen aquí

El model tiene una subclass NSManagedObject personalizada con los @property (nonatomic, retain) NSSet *followers; . Como dije, no estoy realmente seguro de lo que está causando esto, ¡entonces cualquier guía o idea sería genial!

Actualizar

La aplicación se bloquea en este método:

 - (void)saveContext { NSError *error = nil; NSManagedObjectContext *managedObjectContext = self.managedObjectContext; [managedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy]; if (managedObjectContext != nil) { if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { // Replace this implementation with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. NSLog(@"Unresolved error %@, %@", error, [error userInfo]); // Uncomment "abort" makes it work, but I still get the error. abort(); } } } 

Actualización 2

Más código de mis models y cómo los usa:

Cómo configuro mi controller de request de búsqueda:

 - (NSSortDescriptor *)sortDescriptorForFetchRequest { NSSortDescriptor *sortDescriptor; if ([self.postType isEqualToString:@"following"] || [self.postType isEqualToString:@"followers"]) { sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"userId" ascending:NO]; } else { sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"postId" ascending:NO]; } return sortDescriptor; } - (NSEntityDescription *)entityForFetchRequest { NSEntityDescription *entity; if ([self.postType isEqualToString:@"followers"] || [self.postType isEqualToString:@"following"]) { entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:[self.appController managedObjectContext]]; } else { entity = [NSEntityDescription entityForName:@"Post" inManagedObjectContext:[self.appController managedObjectContext]]; } return entity; } - (void)setUpFetchResultController { if (self.fetchedResultsController == nil) { NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; [fetchRequest setEntity:[self entityForFetchRequest]]; [fetchRequest setPnetworkingicate:[self pnetworkingicateBasedOnPostType:self.postType]]; NSArray *sortDescriptors = @[[self sortDescriptorForFetchRequest]]; [fetchRequest setSortDescriptors:sortDescriptors]; self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[self.appController managedObjectContext] sectionNameKeyPath:nil cacheName:[self cacheName]]; self.fetchedResultsController.delegate = self; } } 

Y mi model, User :

 + (void)addUserFromDictionary:(NSDictionary *)dictionary forUser:(User *)user inManagedObjectContext:(NSManagedObjectContext*)moc follower:(BOOL)follower following: (BOOL)following { User *localUser; if (follower) { if ([dictionary isKindOfClass:[NSArray class]]) { NSEnumerator *enumerator = [dictionary objectEnumerator]; id value; while (value = [enumerator nextObject]) { localUser = [self parseUserFromDictionary:value inManagedObjectContext:moc]; if ([self user:localUser alreadyFollowingUser:user inManagedObjectContext:moc] == NO) { [user addFollowersObject:localUser]; [localUser addFollowingObject:user]; } } } } } + (User *)parseUserFromDictionary:(NSDictionary *)dictionary inManagedObjectContext:(NSManagedObjectContext*)moc { NSNumberFormatter *numberFormatter= [[NSNumberFormatter alloc] init]; NSNumber * userId = [numberFormatter numberFromString:(NSString *)[dictionary valueForKey:@"id"]]; User *user; if ([self userAlreadyExist:userId inManagedObjectContext:moc] == NO) { NSEntityDescription *userDescription = [NSEntityDescription entityForName:@"User" inManagedObjectContext:moc]; user = [[User alloc] initWithEntity:userDescription insertIntoManagedObjectContext:moc]; } else { user = [User findUser:userId inManagedObjectContext:moc]; } user.name = [dictionary valueForKey:@"name"]; [...] return user; } 

En un presentimiento: ¿La relación entre los objects en diferentes MOCs? ¡Cosas extrañas pueden suceder si haces eso!

Reproducí tu código y model de datos en un proyecto separado. Pensé que podría ser un ciclo en tus datos o algo así que probé todo el siguiente código:

 [userA addFollowersObject:userB]; [userB addFollowingObject:userA]; [userB addFollowersObject:userA]; [userA addFollowingObject:userB]; [userA addFollowersObject:userA]; [userA addFollowingObject:userA]; [userB addFollowingObject:userB]; [userB addFollowersObject:userB]; 

… pero las salvaguardas eran válidas todo el time. Lo último que se me ocurre es el multihilo. ¿Estás utilizando varios subprocesss a los que estás accediendo a tu ManagedObjectContext? Si es así, eso podría causar inconsistencias en sus datos que causan el error.

Sería útil si brindó más detalles sobre la definición del model, incluidos User y Followers . Esta es una conjetura, pero ¿es inverso para los followers incorrecta?

Espero ver la relación en el usuario definida como:

 M followers User following 

y la relación en Follower definida como:

 M following User followers