Xamarin.Forms MessagingCenter
Model publikování a odběru je vzor zasílání zpráv, při kterém vydavatelé odesílají zprávy, aniž by museli vědět o žádných příjemci, kterým se říká odběratelé. Podobně předplatitelé naslouchají určitým zprávám, aniž by museli mít znalosti o vydavatelích.
Události v .NET implementují model publikování a odběru a jsou nejjednodušším a nejjednodušším přístupem ke komunikační vrstvě mezi komponentami, pokud se nevyžaduje volné párování, jako je ovládací prvek a stránka, která ho obsahuje. Doby života vydavatele a odběratele jsou však vzájemně svzájem ovány odkazy na objekty a typ odběratele musí mít odkaz na typ vydavatele. To může vytvářet problémy se s pamětí, zejména v případě, že existují krátkodobé objekty, které se přihlásí k odběru události statického nebo dlouhodobého objektu. Pokud obslužná rutina události není odebrána, odběratel bude uchován v živém připojení odkazem na něj ve vydavateli, což zabrání nebo zpozdí uvolňování paměti odběratele.
Třída implementuje model publikování a odběru a umožňuje komunikaci založenou na zprávě mezi komponentami, které nejsou pro propojení podle odkazů na objekt a Xamarin.FormsMessagingCenter typ nepohodlné. Tento mechanismus umožňuje vydavatelům a odběratelům komunikovat, aniž by na sebe museli odkazovat, což pomáhá omezit 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 být více vydavatelů, které publikuje jednu zprávu, a několik odběratelů naslouchá stejné zprávě:

Vydavatelé odesílat zprávy MessagingCenter.Send pomocí metody , zatímco odběratelé naslouchají zprávám pomocí metody MessagingCenter.Subscribe . Kromě toho se předplatitelé mohou také v případě potřeby odhlásit z odběru zpráv pomocí MessagingCenter.Unsubscribe metody .
Důležité
Interně používá MessagingCenter třída slabé odkazy. To znamená, že nezachová objekty v paměti a umožní uvolnění paměti. Proto by mělo být nutné odhlásit odběr zprávy pouze v případě, že už třída nepřestane zprávu přijímat.
Publikování zprávy
MessagingCenter messages jsou řetězce. Vydavatelé upozorní odběratele zprávy 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 Send příkladu metoda určuje obecný argument, který představuje odesílatele. Aby odběratel zprávu obdržel, musí také zadat stejný obecný argument, který označuje, že naslouchá zprávě od tohoto odesílatele. Kromě toho tento příklad určuje dva argumenty metody:
- První argument určuje instanci odesílatele.
- Druhý argument určuje zprávu.
Data datové části je také možné odeslat 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ý odesílá zprávu, a druhý je typ odesílaných dat datové části. Aby odběratel zprávu obdržel, musí 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, aby je přijata různými odběrateli. 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 string .
Metoda publikuje zprávu a jakákoli data datové části s použitím přístupu Send "fire-and-forget". Proto se zpráva odesílá i v případě, že nejsou registrovaní žádní odběratelé, kteří by zprávu obdrželi. 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 MessagingCenter.Subscribe z 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 metoda přihlásí objekt k odběru zpráv, které jsou odeslány typem, a spustí delegát zpětného volání v reakci na Subscribethis přijetí HiMainPage 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 se metoda přihlásí k odběru zpráv odesílaných typem , jejichž datovou část SubscribeHi je MainPagestring . 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 , se spustí ve stejném vlákně, které publikuje Subscribe zprávu pomocí Send metody .
Odhlášení odběru zprávy
Odběratelé se mohou odhlásit od zpráv, které už nechcete dostávat. Toho dosáhnete jedním z MessagingCenter.Unsubscribe přetížení:
MessagingCenter.Unsubscribe<MainPage>(this, "Hi");
V tomto příkladu Unsubscribe metoda odhlásí this objekt ze zprávy odeslané HiMainPage typem .
Zprávy obsahující data datové části by měly být odhlásené z používání přetížení, Unsubscribe které určuje dva obecné argumenty:
MessagingCenter.Unsubscribe<MainPage, string>(this, "Hi");
V tomto příkladu metoda odhlásí objekt ze zprávy odeslané typem , jejíž Unsubscribe datovou část thisHiMainPage je string .
Stažení ukázky