Sdílet prostřednictvím


Xamarin.Forms MessagingCenter

Model publikování a odběru je vzor zasílání zpráv, ve kterém vydavatelé odesílají zprávy bez znalosti příjemců, označovaných jako odběratelé. Podobně předplatitelé poslouchají konkrétní zprávy bez znalosti vydavatelů.

Události v .NET implementují model publikování a odběru a představují nejjednodušší a nejjednodušší přístup pro komunikační vrstvu mezi komponentami, pokud není vyžadována volné párování, například ovládací prvek a stránka, která ho obsahuje. Životnost vydavatele a odběratele jsou však vzájemně svázány 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 udržován naživu odkazem na ni v vydavateli a tím se zabrání nebo zpozdí uvolnění paměti odběratele.

Třída Xamarin.FormsMessagingCenter implementuje model publikování a odběru, což umožňuje komunikaci založenou na zprávách mezi komponentami, které jsou nevhodné pro propojení podle objektů a odkazů na typy. Tento mechanismus umožňuje vydavatelům a odběratelům komunikovat, aniž by se museli vzájemně odkazovat, což pomáhá omezit závislosti mezi nimi.

Třída MessagingCenter poskytuje funkci 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 pro stejnou zprávu může naslouchat více odběratelům:

Funkce publikování a odběru vícesměrového vysílání

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

Důležité

Interně třída MessagingCenter používá slabé odkazy. To znamená, že neudrží 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 již nechce zprávu přijmout.

Publikování zprávy

MessagingCenter zprávy jsou řetězce. Vydavatelé upozorňují odběratele 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. Pokud chcete zprávu přijmout, musí odběratel zadat také 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 je možné odeslat také 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. Pokud chcete zprávu přijmout, musí odběratel zadat také 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 typu string.

Metoda Send publikuje zprávu a všechna data datové části pomocí přístupu typu fire-and-forget. Zpráva je proto odeslána i v případě, že nejsou zaregistrovaní žádní odběratelé, kteří zprávu obdrží. V takové situaci se odeslaná zpráva ignoruje.

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

Odběratelé se mohou zaregistrovat k přijetí zprávy 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, které jsou odeslány MainPage typem, a spustí delegát 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 nějakou jinou operaci.

Poznámka:

Odběratel nemusí zpracovávat všechny instance publikované zprávy a to může být řízeno argumenty obecného typu, které jsou zadány 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 typemMainPage, jejichž datová část je .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ý je spuštěn metodou Subscribe , se spustí ve stejném vlákně, které publikuje zprávu pomocí Send metody.

Odhlášení odběru zprávy

Odběratelé si můžou odhlásit odběr 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 z odběru Unsubscribe 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é typemMainPage, jehož datová část je .string