Мониторинг C указателя с помощью KVO

Я пытаюсь создать функцию в Objective-C для мониторинга указателя, объявленного на моей стороне C / C ++ кода, с помощью KVO. Есть ли способ сделать это?

Для разработки. У меня есть указатель на объект C Я передаю этот указатель как void* через мою функцию моста до Objective-C стороны кода.

Можно ли использовать пасс void* настроить КВО и уведомить через:

-(void)observeValueForKeyPath:(NSString *) keyPath of Object:...

когда указатель на объект C изменяется стороной C кода?

0

Решение

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.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]