Inconsistencia en la database: la búsqueda a veces no devuelve nada

Ya pasé algunas horas con eso y parece que no puedo encontrar una solución. Primero, algunas especificaciones de lo que tengo:

  • Objective-C iOS 6 con Core Data
  • Core Data se inicializa desde UIManagedDocument, que tiene activado el ahorro automático.
  • ManagedContext de UIManagedDocument se almacena en una variable estática y se reutiliza en toda la aplicación.
  • La aplicación utiliza RestKit y utilizo la categoría ActiveRecord que proporciona.

Tengo un model con la entidad del equipo. En la aplicación, hay un controller de vista de list de equipo, que carga a los equipos desde el backend. El backend devuelve la matriz JSON, que contiene, entre otros, ID de equipo. Almaceno esta identificación en el campo "id" en mi model, y mientras itero sobre la respuesta del server, busco si el equipo para una ID ya existe. Si lo hace, solo actualizaré su información y pasaré el object, si no, lo creo primero.

Y aquí es donde se vuelve extraño. Esto funciona el 90% del time. Puedo cargar el controller de la list de equipos, ir más lejos en la aplicación, volver al controller (que carga los datos nuevamente) y todo está bien la mayor parte del time. Sin embargo, de vez en cuando, mi request de recuperación no devolverá nada. Como en:

NSArray *results = [context executeFetchRequest:request error:&error]; 

devolverá la matriz vacía, y el error también está vacío. Nada en el server cambia constantemente. La request, cuando bash depurarlo, tiene el siguiente aspecto:

 <NSFetchRequest: 0x127a0e20> (entity: Team; pnetworkingicate: (id == "123"); sortDescriptors: ((null)); limit: 1; type: NSManagedObjectResultType; ) 

Cuando obtengo una vista previa de la tienda sqlite en una aplicación externa, puedo ver que el elemento del Equipo para esta ID está presente, y en otro 90% de veces se carga. Lo que es aún más extraño, cuando enciendo SQLDebug puedo ver:

 2013-04-12 12:00:27.934 SportLink[10831:c07] CoreData: annotation: fetch using NSSQLiteStatement <0x12656d10> on entity 'Team' with sql text 'SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZACI1, t0.ZACI2, t0.ZACI3, t0.ZALTFIRSTNAME, t0.ZALTSECONDNAME, t0.ZCOLOR1, t0.ZCOLOR2, t0.ZGENDER, t0.ZICON, t0.ZID, t0.ZLOCATION, t0.ZLOGO1, t0.ZLOGO2, t0.ZNAME, t0.ZTYPE, t0.ZSPORT FROM ZTEAM t0 WHERE t0.ZID = ? LIMIT 133' returned 6 rows 

lo que significa que la tienda de respaldo realmente buscó los datos, pero por alguna razón no los transmitió. Ahora:

  • Estoy haciendo todo en el hilo principal, así que este no es un problema.
  • Creo que el ahorro automático no es un problema, porque esto puede suceder incluso cuando cierro la aplicación y la abro nuevamente con datos ya presentes.

¿Alguna idea de lo que sucede aquí?

Edit: He perfilado la aplicación con Instruments. Acabo de entrar en el problemático VC, luego ingresé en su controller secundario y leo, lo repitió un par de veces hasta que el problema comenzó a manifestarse. Aquí están los resultados. Tal vez sea más fácil saber lo que está sucediendo desde aquí:

Salida de instrumentos

Después de unos días de investigación, finalmente encontré la causa de este error. El código que estaba trayendo la entidad del Equipo se veía así:

 Team *team = [Team findFirstByAttribute:WSK_ID withValue:data[WSK_ID] inContext:moc]; 

WSK_ID es solo una definición para @"id" . data son un dictionary que obtuve de RestKit, de una respuesta JSON. Debido a que no se lanzó a ningún tipo, probablemente fue un NSString, mientras que la propiedad id de la entidad del Equipo esperaba NSNumber. Si bien no sé lo que solo falle a veces, cambiando este bit a:

 Team *team = [Team findFirstByAttribute:WSK_ID withValue:@([data[WSK_ID] intValue]) inContext:moc]; 

Es decir, lanzar la cadena de ID a int, y luego boxearla con NSNumber solucionó el problema.