2016-08-06 5 views
0

Как я могу получить расширение, чтобы наблюдать за свойством класса, который он расширяет, а также может удалить его позже?KVO в пределах Swift Extension

Например:

У меня есть UIView, и я хотел бы слушать изменения кадра внутри моего расширения UIView. Когда эти изменения происходят, мне нужно запустить код, который изменяет внешний вид вида на основе нового фрейма.

Проблема, с которой я сталкиваюсь, заключается в том, что, хотя я могу настроить наблюдателя, я не могу понять, как его удалить. Нет deinit(), и я бы хотел, чтобы наблюдатель повесился на жизненный цикл UIView.

Я бы предпочел не налагать ответственность за удаление на разработчика, и я не хочу подкласса.

Это даже не должно быть КВО, если есть лучший способ, я хотел бы узнать об этом.

ответ

1

Хотя

Расширение может добавлять новые удобные инициализаторы к классу, но они не могут добавлять новые назначенные инициализаторы или deinitializers к классу. Назначенные инициализаторы и деинициализаторы всегда должны быть предоставлены оригинальной реализацией класса.

Таким образом, я думаю, что вы не можете справиться с ним каким-либо хорошим способом без подкласса.

2

Обычным решением является использование связанного объекта в качестве шпиона-освободителя. Связанные объекты освобождаются, когда их прикрепленный объект освобождается, поэтому вы можете запускать код в своем deinit, который вы хотите запустить, когда прикрепленный объект уходит. Тем не менее, делать это действительно хорошо в многопоточном мире, это немного сложно сказать. Я не рекомендую строить свои собственные. Вместо этого я предлагаю PMKVObserver, который будет обрабатывать это для вас. Даже если вы решите построить свой собственный, вы должны изучить, как PMKVObserver делает свою магию, поэтому вы не слишком наивны в своей реализации.

Выполнение этого небрежно (не беспокоясь о многопоточных условиях гонки) не слишком сложно в Swift, но сделать это действительно хорошо, лучше сделать в ObjC и подключиться к Swift. Опять же, проконсультируйтесь с кодом для сложных футляров.

+0

Я действительно надеялся на что-то гораздо более простое, чем это. :( –