tab guidelines bottom bar ios objective-c xcode core-data key-value-observing

ios - guidelines - Notificaciones de KVO después de mergeChangesFromContextDidSaveNotification



tab bar ios (2)

Estoy usando KVO para observar los cambios en un NSManagedObject. El objeto NSManagedObject que estoy observando es parte de un contexto NSManagedObject que está en la cola principal.

Cuando actualizo este objeto en un contexto de fondo (tipo de concurrencia en cola privada) y luego fusiono los cambios guardados en el contexto de mi cola principal (en mergeChangesFromContextDidSaveNotification), las notificaciones de KVO se activan como se esperaba.

Sin embargo, esperaba que las notificaciones solo se activaran para las rutas clave que realmente cambiaron y no para todas las rutas clave de NSManagedObject. Recibo notificaciones de KVO por cada keypath de mi objeto aunque no hayan cambiado.

¿Es esto por diseño o estoy haciendo algo mal?

No puedo ver nada en los documentos de Apple ....


Es un comportamiento no documentado pero observado en OS X e iOS que un guardado cuenta como un cambio en todo el NSManagedObject no solo en elementos diferentes. Puedes encontrar refunfuños sobre varias consecuencias de eso para enlaces y cosas similares alrededor de este sitio, en openradar.appspot.com, etc. Que el problema también se manifiesta con disparos aparentemente falsos de KVO es completamente sorprendente.

La forma más simple de manejar el problema (bueno, más simple después de ''simplemente volver a mostrar todo en un guardado'' que encuentro una buena opción de primer paso hasta que alguien se queja) es escuchar la notificación genérica de guardado, luego llamar a los valores cambiados en cada objeto actualizado para elegir a los que le interese activar actualizaciones específicas para.

Si eso es irremediablemente ineficiente para su caso de uso, podría crear accesos personalizados (el mogenerator es de gran ayuda para esto) para sus propiedades que recopilan los indicadores de cambios de todas las propiedades que le interesan; y enviar eso como una notificación después de guardar.

Digamos, por ejemplo, que tenemos una aplicación de equipo deportivo profesional que se actualiza constantemente con feeds JSON analizados en segundo plano. Todos los atributos que afectan a la visualización de los diferentes equipos, jugadores, juegos, etc. NSManagedObjects tienen accesodores personalizados que establecen marcadores en una estructura de {playerStatsChanged, teamStatsChanged, leagueRankingsChanged, yadayadayadaChanged} correspondiente a las páginas de la aplicación que deberán volver a mostrar una vez que se recupere. y el hilo de análisis finaliza. Luego, una vez que se guarda, activa una notificación genérica de ''actualizar estas pantallas'' con esa estructura de configuración de indicador. Probablemente esté fusionando las notificaciones de ruta de cambio individuales en alguna lógica de tipo ''actualizar esta pantalla'' de nivel superior en algún lugar, en cualquier caso, ¿verdad? Bueno, en el nivel de establecimiento de la propiedad es prácticamente el punto más bajo en el que puede hacerlo, en la mayoría de los casos razonables. Sin duda, para cualquier diseño de actualización recurrente, como las aplicaciones de nuestro equipo deportivo aquí.


Puede anular las notificaciones de cambios automáticos con notificaciones manuales solo para las teclas que desee. Consulte la documentación detallada aquí .