Как использовать динамические отправки в вашей кодовой базе

Наблюдение за ключом и значением — это шаблон программирования Cocoa, который вы используете для уведомления объектов об изменениях свойств других объектов.

Источник: Документация Apple

Вы когда-нибудь смотрели Шоу Трумэна? Он о парне, который живет обычной жизнью, а каждое его движение записывается и транслируется на широкую аудиторию.

Хорошо, но почему я говорю о фильмах? Что ж, Шоу Трумэна имеет некоторое сходство с паттерном Ключевого наблюдателя. Представьте, что главный герой Шоу Трумана, Труман Бербанк, является свойством класса в вашем приложении, за изменениями которого вы хотите следить.

Чтобы достичь этого, мы должны использовать нечто, называемое динамической диспетчеризацией, о чем я объясню позже (по аналогии с «Шоу Трумэна», вы можете думать об этом шаге, связанном с настройкой камер и телевизионного оборудования).

Приложение AnimeFight

Скачать стартовый проект здесь.

У нас есть два контроллера представления с именами KVOBaseScreen и KVOSelectionScreen. В зависимости от нажатия кнопки на KVOSelectionScreen изображение, метка и цвет KVOBaseScreen меняются.

Шаг 1. Создайте модель

Подумайте об аналогии, которую я предложил ранее; Мы хотим наблюдать за изменением свойства. Имеет смысл создать объект, в котором мы будем хранить эти элементы пользовательского интерфейса — мы можем просто наблюдать за изменениями модели.

Также имеет смысл создать для этого отдельный класс обслуживания, потому что мы можем:

  1. Создайте функцию внутри класса службы, которая вызывается каждый раз при нажатии одной из двух кнопок в приложении.
  2. Создайте переменную, в которой хранится новый экземпляр, переданный функцией. С помощью синглтона мы можем получить доступ к свойствам класса KVOService. Теперь остается только наблюдать за изменениями kvoModel.

Шаг 2: Динамическая отправка

Шаблон Key-Value Observer основан на Objective-C, поэтому оба класса должны быть помечены ключевым словом objc. Причина, по которой мы не используем структуры, заключается в том, что с KVO мы не можем использовать типы значений, поэтому никаких структур, перечислений или кортежей. Типы значений не могут быть представлены в среде выполнения Objective-C. Мы помечаем переменную, которую мы хотим отслеживать, с помощью @ objc dynamic var. Ключевое словоdynamic — это то, что связывает Objective-C с миром Swift, поэтому он работает в среде выполнения Objective-C.

Шаг 3: Наблюдайте за изменениями

На этом этапе мы наблюдаем изменения с помощью встроенного метода observe. Он принимает три аргумента и выглядит так:

_ keypath: — это путь к свойству, которое мы хотим наблюдать. В нашем случае свойство, которое мы хотим наблюдать, находится в нашем KVOService, и для доступа к нему мы используем синглтон. Наша цель — переменная kvoModel.

options: — здесь мы можем решить, хотим ли мы получить доступ к старому значению, новому значению или к тому и другому. Новое значение — это свойство после изменения, старое значение — это свойство до изменения. В некоторых приложениях вы можете захотеть использовать старое свойство, но в нашем приложении оно не используется.

changeHandler: — это замыкание, которое принимает два аргумента и возвращает Void. С первым аргументом мы можем получить доступ к наблюдаемому нами свойству. Второй аргумент имеет тип NSKeyValueObservedChange и обозначает, что наше свойство публикует изменение. Мы можем получить к нему доступ с помощью .newValue . Мы используем новое значение, передав его нашей функции setView, с помощью которой мы выполняем изменения пользовательского интерфейса.

Метод наблюдения возвращает элемент типа NSKeyValueObservation. Это наблюдение нашего свойства, которое мы должны где-то хранить. Наблюдаем это в переменной типа Any. Мы хотим избежать цикла удержания, поэтому захватываем себя с помощью слабого.

Шаг 4: Измените наблюдаемое свойство

Единственное, что осталось сделать, это мутировать саму собственность (аналогично, чтобы мистер Бербанк действительно ушел и жил своей жизнью).

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

Надеюсь, вы чему-то научились. Полный проект можно найти здесь.

Want to Connect?
If you have any questions, contact me on Twitter.