Я пытаюсь создать функцию в Objective-C для мониторинга указателя, объявленного на моей стороне C / C ++ кода, с помощью KVO. Есть ли способ сделать это?
Для разработки. У меня есть указатель на объект C Я передаю этот указатель как void*
через мою функцию моста до Objective-C стороны кода.
Можно ли использовать пасс void*
настроить КВО и уведомить через:
-(void)observeValueForKeyPath:(NSString *) keyPath of Object:...
когда указатель на объект C изменяется стороной C кода?
KVO, с его способностью просто наблюдать за свойством и автоматически получать уведомления при каждом его изменении, кажется волшебством, но на самом деле все, что нужно, это то, что Apple автоматически меняет установщик вашего свойства с этого:
- (void)setFoo:(Foo *)newFoo {
self.foo = newFoo;
}
в это:
- (void)setFoo:(Foo *)newFoo {
[self willChangeValueForKey:@"foo"];
self.foo = newFoo;
[self didChangeValueForKey:@"foo"];
}
will
а также didChangeValueForKey:
методы — это то, что заставляет систему КВО проверять наблюдателей на предмет имущества и уведомлять их, если таковые имеются. Автоматическая замена метода установки выполняется с использованием чрезвычайно динамической природы Objective-C, которая позволяет относительно просто исправлять методы и изменять их во время выполнения (вот почему, кстати, dynamic
ключевое слово необходимо для реализации свойств KVO в Swift). Конечно, эти динамические функции не существуют в C или C ++.
То, что вам нужно будет сделать, это чтобы ваш C-код определял два обратных вызова; тот, который будет вызывать код C перед изменением значения, и другой, который он будет вызывать позже. Как только вы это настроите, пусть Objective-C зарегистрирует эти обратные вызовы где-нибудь в процессе установки, и пусть обратные вызовы вызовут willChangeValueForKey:
а также didChangeValueForKey:
методы. Как только вы это сделаете, вы сможете наблюдать за свойством, используя обычные методы KVO.
Других решений пока нет …