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:
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