2012-08-04 15 views
5

Estoy usando un core data, NSFetchedResultsController UITableView, con un atributo transitorio NSDate. La razón principal por la que tengo esto como propiedad transitoria es para que mis entradas UITableView se pongan en secciones basadas en NSDate, pero pueden moverse entre las secciones cuando la fecha cambie.iOS - ¿Cómo actualizar/actualizar la propiedad transitoria de Core Data?

Hasta ahora parece funcionar muy bien, pero solo actualiza/actualiza (soy muy nuevo en esto, así que no sé si estoy usando la terminología correcta, ¡lo siento!) Cuando cierro el aplicación y elimínela de la multitarea, o vuelva a ejecutarla a través de Xcode. Si no hago eso, los artículos no cambian y no se colocan en las secciones correctas. ¿Hay alguna forma de actualizarlo manualmente para que el usuario no tenga que hacer eso para que funcione correctamente?

¡Gracias!

+0

¿Cómo se propagan las actualizaciones? NSFetchedResultsController delegado? – Mundi

+0

Sí, eso creo. – mhbdr

+1

Podría ser relevante que con una tienda SQlite no pueda usar atributos transitorios para las descripciones de clasificación. –

Respuesta

3

Las propiedades transitorias se actualizan cuando envía un refreshObject:mergeChanges: a su objeto.

La solución proporcionada por Mundi para aplicar el mecanismo de observación del valor clave también podría funcionar y, si lo hace, es definitivamente mucho más conveniente que actualizar de forma explícita.

+0

Hola svena, gracias por la respuesta. ¿Dónde pondría el refreshObject: mergeChanges? ¿Estaría dentro de una acción? ¡Gracias! – mhbdr

+0

Puede actualizar el objeto en los puntos donde sabe que se cambió la fecha. Sin embargo, lo aliento a que tome el enfoque recomendado por Mundi. Es mucho más conveniente. Es bueno saber que siempre puedes actualizar una propiedad transitoria de forma explícita si así lo deseas. – svena

+0

Parece que las propiedades transitorias no se actualizan: "Si la bandera es SÍ, este método no afecta ninguna propiedad transitoria" https://developer.apple.com/reference/coredata/nsmanagedobjectcontext/1506224-refreshobject –

7

Primero, asegúrese de que la propiedad transitoria solo se utiliza para el sectionNameKeyPath al crear el controlador de resultados obtenido. Mejor nombre es sectionIdentifier (como lo hace Apple en su código de muestra). La fecha real debe ser un atributo separado de su entidad. (Lo llamaré dateAttribute

Segunda, asegúrese de que especifica las dependencias de ruta clave en el archivo de Entity.m:.

+ (NSSet *)keyPathsForValuesAffectingSectionIdentifier { 
    // If the value of dateAttribute changes, the section identifier may change as well. 
    return [NSSet setWithObject:@"dateAttribute"]; 
} 

Tercer, asegúrese de que en su controlador, reaccionar adecuadamente a los cambios en el contexto de objeto gestionado a través

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    if (!self.tableView.editing) [self.tableView reloadData]; 
    // the quick and dirty method without animations; 
    // see referenced code for a more pleasant approach 
} 

Si algo no está claro, echar un vistazo al ejemplo de Apple DateSectionTitles.

+0

¿Estás 100% seguro de que keyPathsForValuesAffecting ... fuerza una actualización mientras es una propiedad transitoria? Anteriormente me di cuenta de que las propiedades transitorias se actualizan solo cuando refreshObject: mergeChanges: se envía al objeto. – svena

+0

Sí, claro. Este es el código de trabajo de una aplicación en vivo. – Mundi

+0

Así que lo tengo configurado casi exactamente como el ejemplo de Apple, pero no parece actualizar cuando hay un cambio. El identificador de sección para cada elemento se crea mediante un gran cálculo de diferencias nsdate, pero cuando lo inicio, parece que no vuelve a calcular las mismas como lo hace cuando elimino la aplicación de la multitarea y la vuelvo a abrir. – mhbdr