para bucle colgando aleatoriamente en executeFetchRequest: error:

Recientemente encontré un problema extraño con mi aplicación de iOS y no tengo idea de cómo arreglarlo.

Durante la primera ejecución hay un método que se ejecuta en segundo plano que descarga una list de elementos y attributes de elementos de un juego y los almacena en Datos básicos para su uso en relaciones posteriores. La parte del método de import que maneja los artículos se ve así:

NSManagedObject *item; for (TFSchemaItem *tfItem in [bs items]) { item = [NSEntityDescription insertNewObjectForEntityForName:@"SchemaItem" inManagedObjectContext:managedObjectContext_]; NSLog(@"%@", [tfItem itemName]); [item setValue:[tfItem itemName] forKey:@"itemName"]; [item setValue:[NSNumber numberWithInteger:[tfItem defindex]] forKey:@"defindex"]; [item setValue:[tfItem itemClass] forKey:@"itemClass"]; [item setValue:[tfItem type] forKey:@"itemType"]; [item setValue:[tfItem name] forKey:@"tfName"]; [item setValue:[NSNumber numberWithInteger:[tfItem slot]] forKey:@"itemSlot"]; [item setValue:[NSNumber numberWithInteger:[tfItem quality]] forKey:@"itemQuality"]; [item setValue:[[tfItem imageURL] absoluteString] forKey:@"imageURL"]; [item setValue:[[tfItem largeImageURL] absoluteString] forKey:@"largeImageURL"]; [item setValue:[NSNumber numberWithInteger:[tfItem craftClass]] forKey:@"craftClass"]; [item setValue:[tfItem itemDescription] forKey:@"tfDescription"]; [item setValue:[NSNumber numberWithBool:[tfItem properName]] forKey:@"properName"]; NSFetchRequest *fetch = [[NSFetchRequest alloc] init]; NSMutableArray *attrArray = [[NSMutableArray alloc] init]; for (TFItemAttribute *attr in [tfItem attributes]) { [attrArray addObject:[NSNumber numberWithInt:[attr defindex]]]; } NSPnetworkingicate *pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:@"defindex IN %@", attrArray]; [attrArray release]; [fetch setEntity:[NSEntityDescription entityForName:@"Attribute" inManagedObjectContext:managedObjectContext_]]; [fetch setPnetworkingicate:pnetworkingicate]; [fetch setReturnsObjectsAsFaults:NO]; NSLog(@"1"); NSArray *fetchArray = [managedObjectContext_ executeFetchRequest:fetch error:nil]; NSLog(@"2"); [item setValue:[NSSet setWithArray:fetchArray] forKey:@"attributes"]; ... } 

Antes de esto, hay otro bucle, que es idéntico además de tratar con la entidad de atributo sobre SchemaItem y no necesita crear ninguna relación en sí misma, lo cual funciona bien.

El problema con este bucle es que, random, el bucle se cuelga en [managedObjectContext_ executeFetchRequest:fetch error:nil] , obtendré el "1" registrado en la console, pero no el "2" inmediatamente después. Lo extraño de esto, sin embargo, es que a veces el ciclo se ejecutará con éxito, sin problemas.

Si bien es algo agradable que el bucle funcione bien a veces , no me queda más executeFetchRequest:error: que saber qué está haciendo que se executeFetchRequest:error: en executeFetchRequest:error: cualquier otro momento.

¿Alguien aquí puede ver algo que me he perdido? Mi cabeza se ha frito con esto por 2 días.

¿Cuelgas, eh?

Suena como un problema de concurrency; tus cerraduras están mal anidadas Cuando se cuelga, irrompete en el depurador (presiona el button de pausa) y mira las vueltas de todos los hilos. Lo más probable es que no, encontrará dos (o más) hebras acuñadas en un candado.

Como sugirió Daniel T, debe leer la guía de concurrency de Datos básicos .

Un error común es pensar que las operaciones de lectura son automágicamente seguras para subprocesss.