Xamarin.Forms MessagingCenter
Wzorzec publikowania-subskrybowania to wzorzec obsługi komunikatów, w którym wydawcy wysyłają komunikaty bez znajomości jakichkolwiek odbiorców, znanych jako subskrybenci. Podobnie subskrybenci słuchają określonych komunikatów bez znajomości jakichkolwiek wydawców.
Zdarzenia na platformie .NET implementują wzorzec publikowania-subskrybowania i są najprostszym i najprostszym podejściem do warstwy komunikacji między składnikami, jeśli luźne sprzęganie nie jest wymagane, takie jak kontrolka i strona, która ją zawiera. Jednak okresy istnienia wydawcy i subskrybenta są powiązane ze sobą przez odwołania do obiektów, a typ subskrybenta musi mieć odwołanie do typu wydawcy. Może to powodować problemy z zarządzaniem pamięcią, zwłaszcza gdy istnieją obiekty krótkotrwałe, które subskrybują zdarzenie obiektu statycznego lub długotrwałego. Jeśli program obsługi zdarzeń nie zostanie usunięty, subskrybent będzie nadal aktywny przez odwołanie do niego w wydawcy, co uniemożliwi lub opóźni odzyskiwanie pamięci subskrybenta.
Klasa Xamarin.FormsMessagingCenter
implementuje wzorzec publikowania-subskrybowania, umożliwiając komunikację opartą na komunikatach między składnikami, które są niewygodne do łączenia według odwołań do obiektu i typu. Ten mechanizm umożliwia wydawcom i subskrybentom komunikowanie się bez odwołwania się do siebie, co pomaga zmniejszyć zależności między nimi.
Klasa MessagingCenter
zapewnia funkcję publikowania-subskrybowania multiemisji. Oznacza to, że może istnieć wiele wydawców, którzy publikują jeden komunikat, a wielu subskrybentów może nasłuchiwać tego samego komunikatu:
Wydawcy wysyłają komunikaty przy użyciu MessagingCenter.Send
metody , podczas gdy subskrybenci nasłuchują komunikatów przy użyciu MessagingCenter.Subscribe
metody . Ponadto subskrybenci mogą również anulować subskrypcję wiadomości, jeśli jest to wymagane, za pomocą MessagingCenter.Unsubscribe
metody .
Ważne
MessagingCenter
Wewnętrznie klasa używa słabych odwołań. Oznacza to, że nie będzie utrzymywać obiektów przy życiu i pozwoli im na zbieranie pamięci. W związku z tym należy anulować subskrypcję wiadomości tylko wtedy, gdy klasa nie chce już otrzymywać wiadomości.
Publikowanie komunikatu
MessagingCenter
komunikaty to ciągi. Wydawcy powiadamiają subskrybentów o wiadomości z jednym MessagingCenter.Send
z przeciążeń. Poniższy przykład kodu publikuje Hi
komunikat:
MessagingCenter.Send<MainPage>(this, "Hi");
W tym przykładzie Send
metoda określa ogólny argument reprezentujący nadawcę. Aby otrzymać komunikat, subskrybent musi również określić ten sam argument ogólny, wskazując, że nasłuchują komunikatu od tego nadawcy. Ponadto w tym przykładzie określono dwa argumenty metody:
- Pierwszy argument określa wystąpienie nadawcy.
- Drugi argument określa komunikat.
Dane ładunku można również wysłać za pomocą komunikatu:
MessagingCenter.Send<MainPage, string>(this, "Hi", "John");
W tym przykładzie Send
metoda określa dwa argumenty ogólne. Pierwszy to typ wysyłający komunikat, a drugi to typ wysyłanych danych ładunku. Aby otrzymać komunikat, subskrybent musi również określić te same argumenty ogólne. Dzięki temu wiele komunikatów współużytkujących tożsamość wiadomości, ale wysyła różne typy danych ładunku do odbierania przez różnych subskrybentów. Ponadto w tym przykładzie określono trzeci argument metody, który reprezentuje dane ładunku, które mają być wysyłane do subskrybenta. W takim przypadku dane ładunku to string
.
Metoda Send
opublikuje komunikat i wszelkie dane ładunku przy użyciu podejścia fire-and-forget. W związku z tym wiadomość jest wysyłana nawet wtedy, gdy nie ma subskrybentów zarejestrowanych w celu odebrania wiadomości. W takiej sytuacji wysłana wiadomość jest ignorowana.
Subskrybowanie wiadomości
Subskrybenci mogą zarejestrować się, aby otrzymywać komunikat przy użyciu jednego z MessagingCenter.Subscribe
przeciążeń. Poniższy przykład kodu przedstawia przykład tego:
MessagingCenter.Subscribe<MainPage> (this, "Hi", (sender) =>
{
// Do something whenever the "Hi" message is received
});
W tym przykładzie Subscribe
metoda subskrybuje this
obiekt do Hi
komunikatów, które są wysyłane przez MainPage
typ, i wykonuje delegat wywołania zwrotnego w odpowiedzi na odbieranie komunikatu. Delegat wywołania zwrotnego określony jako wyrażenie lambda może być kodem, który aktualizuje interfejs użytkownika, zapisuje niektóre dane lub wyzwala inną operację.
Uwaga
Subskrybent może nie musi obsługiwać każdego wystąpienia opublikowanego komunikatu i może być kontrolowany przez argumenty typu ogólnego określone w metodzie Subscribe
.
W poniższym przykładzie pokazano, jak zasubskrybować komunikat zawierający dane ładunku:
MessagingCenter.Subscribe<MainPage, string>(this, "Hi", async (sender, arg) =>
{
await DisplayAlert("Message received", "arg=" + arg, "OK");
});
W tym przykładzie Subscribe
metoda subskrybuje Hi
komunikaty wysyłane przez MainPage
typ, którego ładunek danych to string
. Delegat wywołania zwrotnego jest wykonywany w odpowiedzi na odbieranie takiego komunikatu, który wyświetla dane ładunku w alercie.
Ważne
Delegat wykonywany przez Subscribe
metodę zostanie wykonany w tym samym wątku, który publikuje komunikat przy użyciu Send
metody .
Anulowanie subskrypcji wiadomości
Subskrybenci mogą anulować subskrypcję wiadomości, które nie chcą już otrzymywać. Jest to osiągane przy użyciu jednego MessagingCenter.Unsubscribe
z przeciążeń:
MessagingCenter.Unsubscribe<MainPage>(this, "Hi");
W tym przykładzie Unsubscribe
metoda anuluje this
subskrypcję obiektu z komunikatu wysłanego Hi
MainPage
przez typ.
Komunikaty zawierające dane ładunku powinny zostać anulowane przy użyciu Unsubscribe
przeciążenia, które określa dwa argumenty ogólne:
MessagingCenter.Unsubscribe<MainPage, string>(this, "Hi");
W tym przykładzie metoda anuluje this
subskrypcję obiektu z komunikatu wysłanego MainPage
Hi
przez typ, którego ładunek danych to string
.Unsubscribe