Publikování a přihlášení k odběru zpráv

Model publikování a odběru je vzor zasílání zpráv, ve kterém vydavatelé odesílají zprávy, aniž by měli znalosti všech příjemců, kterým se říká odběratelé. Podobně předplatitelé poslouchají konkrétní zprávy, aniž by měli znalosti o všech vydavatelích.

Události v .NET implementují model publikování a odběru a jsou nejjednodušším a nejjednodušším přístupem pro komunikační vrstvu mezi komponentami, pokud není vyžadováno volné spojení, například ovládací prvek a stránka, která ho obsahuje. Životnost vydavatele a předplatitele jsou však svázané odkazy na objekty a typ odběratele musí mít odkaz na typ vydavatele. To může způsobit problémy se správou paměti, zejména pokud existují krátkodobé objekty, které se přihlašují k odběru události statického nebo dlouhodobého objektu. Pokud obslužná rutina události není odebrána, odběratel bude zachován odkazem na ni v vydavateli a tím zabrání nebo zpozdí uvolňování paměti odběratele.

Třída .NET Multi-Platform App UI (.NET MAUI) MessagingCenter implementuje model publikování a odběru, což umožňuje komunikaci založenou na zprávách mezi komponentami, které nejsou nevhodné pro propojení podle odkazů na objekt a typ. Tento mechanismus umožňuje vydavatelům a odběratelům komunikovat bez vzájemné vazby, což pomáhá snížit závislosti mezi nimi.

Třída MessagingCenter poskytuje funkce publikování a odběru vícesměrového vysílání. To znamená, že může existovat více vydavatelů, kteří publikují jednu zprávu, a může existovat více odběratelů, kteří naslouchají stejné zprávě:

Multicast publish-subscribe functionality.

Vydavatelé odesílají zprávy pomocí MessagingCenter.Send metody, zatímco předplatitelé poslouchají zprávy pomocí MessagingCenter.Subscribe metody. Předplatitelé se navíc můžou odhlásit odběry zpráv, pokud je to potřeba, pomocí MessagingCenter.Unsubscribe této metody.

Důležité

Interně MessagingCenter třída používá slabé odkazy. To znamená, že nebude udržovat objekty naživu a umožní jim uvolňování paměti. Proto by mělo být nutné odhlásit odběr zprávy pouze v případě, že třída už nechce zprávu přijmout.

Publikování zprávy

MessagingCenter zprávy jsou řetězce. Vydavatelé upozorňují předplatitele na zprávu s jedním z MessagingCenter.Send přetížení. Následující příklad kódu publikuje Hi zprávu:

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

V tomto příkladu Send metoda určuje obecný argument, který představuje odesílatele. Aby se zpráva zobrazila, musí odběratel také zadat stejný obecný argument, který označuje, že naslouchá zprávě od daného odesílatele. Tento příklad navíc určuje dva argumenty metody:

  • První argument určuje instanci odesílatele.
  • Druhý argument určuje zprávu.

Data datové části se dají odeslat také se zprávou:

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

V tomto příkladu Send metoda určuje dva obecné argumenty. První je typ, který zprávu odesílá, a druhá je typ odesílaných dat datové části. Aby se zpráva zobrazila, musí odběratel také zadat stejné obecné argumenty. To umožňuje více zpráv, které sdílejí identitu zprávy, ale odesílají různé datové typy datové části, které budou přijímat různí odběratelé. Kromě toho tento příklad určuje třetí argument metody, který představuje data datové části, která se mají odeslat odběrateli. V tomto případě jsou daty datové části a string.

Metoda Send publikuje zprávu a všechna data datové části pomocí přístupu fire-and-forget. Zpráva se proto odešle i v případě, že nejsou zaregistrovaní žádní odběratelé pro příjem zprávy. V takovém případě se odeslaná zpráva ignoruje.

Přihlášení k odběru zprávy

Odběratelé se můžou zaregistrovat, aby dostali zprávu pomocí jednoho z MessagingCenter.Subscribe přetížení. Následující příklad kódu ukazuje příklad tohoto:

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

V tomto příkladu Subscribe metoda přihlásí objekt k Hi odběru this zpráv odesílaných MainPage typem a spustí delegáta zpětného volání v reakci na přijetí zprávy. Delegát zpětného volání zadaný jako výraz lambda může být kód, který aktualizuje uživatelské rozhraní, uloží některá data nebo aktivuje jinou operaci.

Poznámka

Odběratel nemusí zpracovávat každou instanci publikované zprávy a to může být řízeno obecnými argumenty typu, které jsou zadané v Subscribe metodě.

Následující příklad ukazuje, jak se přihlásit k odběru zprávy, která obsahuje data datové části:

MessagingCenter.Subscribe<MainPage, string>(this, "Hi", async (sender, arg) =>
{
    await DisplayAlert("Message received", "arg=" + arg, "OK");
});

V tomto příkladu Subscribe se metoda přihlásí k Hi odběru zpráv odesílaných typem MainPage , jejichž daty datové části jsou string. Delegát zpětného volání se spustí v reakci na přijetí takové zprávy, která zobrazí data datové části v upozornění.

Důležité

Delegát, který metoda spouští Subscribe , se spustí ve stejném vlákně, které zprávu publikuje pomocí Send metody.

Odhlášení odběru zprávy

Předplatitelé se můžou odhlásit od odběru zpráv, které už nechtějí dostávat. Toho dosáhnete jedním z MessagingCenter.Unsubscribe přetížení:

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

V tomto příkladu Unsubscribe metoda zruší odběr this objektu Hi ze zprávy odeslané typem MainPage .

Zprávy obsahující data datové části by se měly odhlásit od odběru Unsubscribe pomocí přetížení, které určuje dva obecné argumenty:

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

V tomto příkladu Unsubscribe metoda odhlásí this objekt ze Hi zprávy odeslané typem MainPage , jehož dat datové části je string.