Wygląda na to, że nie ma wbudowanej funkcji subskrypcji zmian we wszystkich właściwościach obiektów.
Jeśli nie dbają o której dokładnie nieruchomość zmieniła i można zmienić klasę można dodać właściwość obojętne na to, aby obserwować zmiany w innych właściwościach (używając + keyPathsForValuesAffectingValueForKey
lub +keyPathsForValuesAffecting<Key>
metody):
// .h. We don't care about the value of this property, it will be used only for KVO forwarding
@property (nonatomic) int dummy;
#import <objc/runtime.h>
//.m
+ (NSSet*) keyPathsForValuesAffectingDummy{
NSMutableSet *result = [NSMutableSet set];
unsigned int count;
objc_property_t *props = class_copyPropertyList([self class], &count);
for (int i = 0; i < count; ++i){
const char *propName = property_getName(props[i]);
// Make sure "dummy" property does not affect itself
if (strcmp(propName, "dummy"))
[result addObject:[NSString stringWithUTF8String:propName]];
}
free(props);
return result;
}
teraz jeśli zauważysz właściwość dummy
, otrzymasz powiadomienie KVO za każdym razem, gdy zmieni się dowolna właściwość obiektu.
Możesz również uzyskać listę wszystkich właściwości w obiekcie, jak w zaksięgowanym kodzie i zasubskrybuj powiadomienia KVO dla każdego z nich w pętli (nie musisz więc korzystać z wartości twardego kodu) - w ten sposób " W razie potrzeby otrzymam zmienioną nazwę właściwości.
To wydaje się pośrednie, ale wskazał mi właściwy kierunek. class_copyPropertyList() i property_getname() są wystarczające do dodania obserwacji do każdej właściwości, dokładnie tak, jak pierwotnie zadawano. –
Czy są jakieś uaktualnienia fragmentu kodu powyżej? – fatuhoku
Plus, czy to działa dla NSManagedObjects? – fatuhoku