Введение:

MessagingCenter - один из наиболее важных API-интерфейсов, о котором следует знать при работе с Xamarin.Forms и MVVM. MessagingCenter включает простую службу обмена сообщениями для отправки и получения сообщений.

Пожалуйста, обратитесь к этому удивительному документу от Microsoft, который познакомит вас с некоторыми основами, некоторые из которых я подробно изложил в этом посте:



Обзор

Xamarin.Forms MessagingCenter позволяет виртуальным машинам и другим компонентам обмениваться данными, не зная друг о друге ничего, кроме простого контракта обмена сообщениями. Цель MVVM - абстрагировать ваши представления от бизнес-логики. Я считаю, что это обеспечивает как повторное использование, так и тестируемость кода. Различные платформы MVVM предлагают инструменты для улучшения вышеуказанного. Они встроены в Xamarin.Forms, но одна функция, о которой забывают большинство разработчиков, - это MessagingCenter. Вся его цель состоит в том, чтобы позволить моделям представления или другим компонентам взаимодействовать друг с другом, не зная ничего друг о друге, кроме простого контракта сообщений.

Работающий:

MessagingCenter предоставляет следующие API:

  • Subscribe - прослушивает сообщения с определенной подписью и выполняет действие при их получении. (Несколько подписчиков могут прослушивать одно и то же сообщение.)
  • Send - публикует сообщение для слушателей. Если ни один слушатель не подписался, сообщение игнорируется.

MessagingCenter - это статический класс с методами Subscribe и Send, которые используются во всем решении.

Сообщения содержат строку message в качестве параметра, который используется для адресации сообщений. Методы Subscribe и Send используют общие параметры для дальнейшего управления доставкой сообщений - два сообщения с одинаковым message текстом, но с разными аргументами универсального типа не будут доставлены одному и тому же подписчику.

API для MessagingCenter довольно прост. Аргументы для подписки, отправки и отказа от подписки следующие:

Subscribe<TSender> (object subscriber, string message, Action<TSender> callback, TSender source = null)

Subscribe<TSender, TArgs> (object subscriber, string message, Action<TSender, TArgs> callback, TSender source = null)

Send<TSender> (TSender sender, string message)

Send<TSender, TArgs> (TSender sender, string message, TArgs args)

Unsubscribe<TSender, TArgs> (object subscriber, string message)

Unsubscribe<TSender> (object subscriber, string message)

Использование MessagingCenter

Сообщения могут быть отправлены в результате взаимодействия с пользователем (например, нажатие кнопки), системного события (например, изменения состояния элементов управления) или какого-либо другого события (например, завершения асинхронной загрузки).

Подписчики могут прислушиваться к изменению внешнего вида пользовательского интерфейса, сохранению данных или запуску какой-либо другой операции.

Для получения дополнительной информации об использовании класса MessagingCenter см. Обмен данными между слабосвязанными компонентами.

Простое строковое сообщение

Самое простое сообщение содержит только строку в параметре message. Subscribe метод, который прослушивает простое строковое сообщение, как показано ниже - обратите внимание, что общий тип, определяющий отправителя, должен иметь тип MainPage. Любые классы в решении могут подписаться на сообщение, используя этот синтаксис:

MessagingCenter.Subscribe<MainPage> (this, "Hi", (sender) => {
    // do something whenever the "Hi" message is sent
});

В классе MainPage следующий код отправляет сообщение. Параметр this является экземпляром MainPage.

MessagingCenter.Send<MainPage> (this, "Hi");

Строка не меняется - она ​​указывает тип сообщения и используется для определения подписчиков, которых нужно уведомить. Этот вид сообщений используется для указания на то, что произошло событие, например, «загрузка завершена», когда дополнительная информация не требуется.

Передача аргумента

Чтобы передать аргумент с сообщением, укажите Тип аргумента в Subscribe общих аргументах и ​​в сигнатуре действия.

MessagingCenter.Subscribe<MainPage, string> (this, "Hi", (sender, arg) => {
    // do something whenever the "Hi" message is sent
    // using the 'arg' parameter which is a string
});

Чтобы отправить сообщение с аргументом, включая универсальный параметр Type и значение аргумента в вызове метода Send.

MessagingCenter.Send<MainPage, string> (this, "Hi", "John");

В этом простом примере используется аргумент string, но можно передать любой объект C #.

Есть замечательный блог Джеймса Монтемагно, в котором он подробно показал, как использовать MessagingCenter API.

Отписаться от рассылки

Объект может отказаться от подписки на подписку сообщения, чтобы сообщения не доставлялись в будущем. Синтаксис метода Unsubscribe должен отражать подпись сообщения (поэтому может потребоваться включить общий параметр Type для аргумента сообщения).

MessagingCenter.Unsubscribe<MainPage> (this, "Hi");
MessagingCenter.Unsubscribe<MainPage, string> (this, "Hi");

Резюме

MessagingCenter - простой способ уменьшить взаимосвязь, особенно между моделями представления. Его можно использовать для отправки и получения простых сообщений или передачи аргумента между классами. Классы должны отказаться от подписки на сообщения, которые они больше не хотят получать.

Если я что-то пропустил, добавляйте в комментарии. Я обязательно внесу в сообщение все необходимые изменения. Кроме того, если вы обнаружите что-то неправильное в блоге, пожалуйста, исправьте меня в комментариях.

Нажмите эту кнопку, если вам понравился этот пост.

Вы можете связаться со мной в LinkedIn или StackOverflow! Я всегда на связи! :П

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

Независимая редакция, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по обработке данных и группам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим участникам и не продаем рекламу.

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее и лучше строить модели машинного обучения.