Udostępnij za pośrednictwem


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:

Funkcja publikowania i subskrybowania multiemisji

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