¿Hay alguna manera de saber cuándo comienza / termina KVO para un valor particular?

Tengo algunos valores que se calculan sobre collections, y pueden o no mostrarse (y, por lo tanto, pueden o no tener un observador) en un momento dado. Preferiría no tener que rastrear a todos los miembros de la colección si nadie está observando mis valores calculados.

¿Puedo decir si alguien está actualmente observando un valor y puedo saber cuándo comienzan a observar?

Sé por un object dado foo Puedo usar [foo observationInfo] para get una list de observadores con las routes key registradas con una raíz en foo, pero eso no consigue automáticamente todas las routes TO foo (de hecho, solo las marcas para observe la autokey de foo).

Esa no es una buena idea desde el punto de vista del layout. Si realmente insiste en no actualizar los contenidos cuando nadie los necesita (lo que podría ser un caso legítimo, por ejemplo, si las actualizaciones son caras), puede introducir methods para iniciar / detener las actualizaciones:

 - (void) beginUpdatingContents; - (void) endUpdatingContents; 

Estos deberían estar atados a un contador dentro de la class y si el contador es> 0, usted sabe que alguien quiere mantener los contenidos actualizados. Esta solución es explícita y, por lo tanto, mejor que la magia silenciosa con KVO.

Si quieres más magia, ¿qué hay de anular addObserver:forKeyPath:options:context: and removeObserver:forKeyPath: y rastrear lo que todavía te está observando?

La forma en que lo he hecho en el pasado es haciendo objects envolventes (los llamé enlaces) que configuran KVO y también se registran con el objective. Por lo tanto, un usuario llamaría MyBinding *binding = [targetObject bindKeyPath:@"foo" ...] y luego [binding detach] . Luego, debes usar el enlace KVO debajo del capó y mantener una list de ellos para que sepas cuándo está vacío.