Xamarin.Forms MessagingCenter
Yayımlama-abone olma düzeni, yayımcıların abone olarak bilinen alıcıları bilmeden ileti gönderdiği bir mesajlaşma düzenidir. Benzer şekilde, aboneler herhangi bir yayımcı hakkında bilgi sahibi olmadan belirli iletileri dinler.
.NET'teki olaylar yayımlama-abone olma desenini uygular ve denetim ve onu içeren sayfa gibi gevşek bağlama gerekli değilse bileşenler arasındaki iletişim katmanı için en basit ve en basit yaklaşımdır. Ancak, yayımcı ve abone yaşam süreleri birbirine nesne başvuruları ile birleştirilmiştir ve abone türünün yayımcı türüne bir başvurusu olmalıdır. Bu, özellikle statik veya uzun ömürlü bir nesnenin olayına abone olan kısa ömürlü nesneler olduğunda bellek yönetimi sorunları oluşturabilir. Olay işleyicisi kaldırılmazsa, abone yayımcıdaki başvuru tarafından canlı tutulur ve bu, abonenin çöp toplamasını engeller veya geciktirecektir.
Xamarin.FormsMessagingCenter
sınıfı yayımla-abone ol desenini uygulayarak nesneye ve tür başvurularına göre bağlantı kurması zor olan bileşenler arasında ileti tabanlı iletişime olanak sağlar. Bu mekanizma, yayımcıların ve abonelerin birbirlerine başvuruda bulunmadan iletişim kurmasına olanak sağlayarak aralarındaki bağımlılıkları azaltmaya yardımcı olur.
sınıfı çok MessagingCenter
noktaya yayın yayımlama-abone olma işlevselliği sağlar. Bu, tek bir iletiyi yayımlayan birden çok yayımcı olabileceği ve aynı iletiyi dinleyen birden çok abone olabileceği anlamına gelir:
Yayımcılar yöntemini kullanarak MessagingCenter.Send
ileti gönderirken, aboneler yöntemini kullanarak MessagingCenter.Subscribe
iletileri dinler. Ayrıca, aboneler gerekirse yöntemiyle ileti aboneliklerinin aboneliğini MessagingCenter.Unsubscribe
kaldırabilir.
Önemli
Dahili olarak, MessagingCenter
sınıfı zayıf başvurular kullanır. Bu, nesneleri canlı tutmayacağı ve atık toplamalarına izin verileceği anlamına gelir. Bu nedenle, yalnızca bir sınıf artık iletiyi almak istemediğinde ileti aboneliğini kaldırmak gerekir.
İleti yayımlama
MessagingCenter
iletileri dizelerdir. Yayımcılar, aşırı yüklemelerden biriyle MessagingCenter.Send
bir iletiyi abonelere bildirir. Aşağıdaki kod örneği bir Hi
ileti yayımlar:
MessagingCenter.Send<MainPage>(this, "Hi");
Bu örnekte yöntemi, Send
göndereni temsil eden genel bir bağımsız değişken belirtir. İletiyi almak için abonenin de aynı genel bağımsız değişkeni belirtmesi gerekir ve bu da gönderenden gelen bir iletiyi dinlediğini belirtir. Buna ek olarak, bu örnek iki yöntem bağımsız değişkeni belirtir:
- İlk bağımsız değişken gönderen örneğini belirtir.
- İkinci bağımsız değişken iletiyi belirtir.
Yük verileri bir iletiyle de gönderilebilir:
MessagingCenter.Send<MainPage, string>(this, "Hi", "John");
Bu örnekte yöntemi iki Send
genel bağımsız değişken belirtir. birincisi iletiyi gönderen tür, ikincisi ise gönderilen yük verilerinin türüdür. İletiyi almak için abonenin de aynı genel bağımsız değişkenleri belirtmesi gerekir. Bu, bir ileti kimliğini paylaşan ancak farklı aboneler tarafından farklı yük veri türleri gönderen birden çok iletinin alınmasını sağlar. Ayrıca, bu örnek aboneye gönderilecek yük verilerini temsil eden üçüncü bir yöntem bağımsız değişkeni belirtir. Bu durumda yük verileri bir string
olur.
Send
yöntemi, fire-and-forget yaklaşımını kullanarak iletiyi ve tüm yük verilerini yayımlar. Bu nedenle, iletiyi almak için kayıtlı aboneler olmasa bile ileti gönderilir. Bu durumda, gönderilen ileti yoksayılır.
İletiye abone olma
Aboneler, aşırı yüklemelerden birini MessagingCenter.Subscribe
kullanarak bir ileti almak için kaydolabilir. Aşağıdaki kod örneği bunun bir örneğini gösterir:
MessagingCenter.Subscribe<MainPage> (this, "Hi", (sender) =>
{
// Do something whenever the "Hi" message is received
});
Bu örnekte yöntemi, Subscribe
nesnesini türü tarafından MainPage
gönderilen iletilere Hi
abone eder this
ve iletiyi almaya yanıt olarak bir geri çağırma temsilcisi yürütür. Lambda ifadesi olarak belirtilen geri çağırma temsilcisi, kullanıcı arabirimini güncelleştiren, bazı verileri kaydeden veya başka bir işlemi tetikleyen kod olabilir.
Not
Abonenin yayımlanan iletinin her örneğini işlemesi gerekmeyebilir ve bu, yönteminde Subscribe
belirtilen genel tür bağımsız değişkenleri tarafından denetlenebilir.
Aşağıdaki örnek, yük verilerini içeren bir iletiye nasıl abone olunduğunu gösterir:
MessagingCenter.Subscribe<MainPage, string>(this, "Hi", async (sender, arg) =>
{
await DisplayAlert("Message received", "arg=" + arg, "OK");
});
Bu örnekte yöntemi, Subscribe
yük verileri bir string
olan türü tarafından MainPage
gönderilen iletilere abonedirHi
. Bir geri arama temsilcisi, yük verilerini bir uyarıda görüntüleyen böyle bir iletinin alınmasına yanıt olarak yürütülür.
Önemli
yöntemi tarafından Subscribe
yürütülen temsilci, yöntemini kullanarak iletiyi yayımlayan aynı iş parçacığında Send
yürütülür.
İleti aboneliğini kaldırma
Aboneler artık almak istemedikleri iletilerin aboneliğini kaldırabilir. Bu, aşırı yüklemelerden MessagingCenter.Unsubscribe
biriyle elde edilir:
MessagingCenter.Unsubscribe<MainPage>(this, "Hi");
Bu örnekte yöntemi, Unsubscribe
türü tarafından gönderilen iletiden nesnenin this
Hi
aboneliğini MainPage
kaldırır.
Yük verilerini içeren iletilerin iki genel bağımsız değişken belirten aşırı yükleme kullanılarak Unsubscribe
aboneliği kaldırılmalıdır:
MessagingCenter.Unsubscribe<MainPage, string>(this, "Hi");
Bu örnekte yöntemi, Unsubscribe
yük verileri bir string
olan türü tarafından gönderilen iletideki Hi
nesnesinin MainPage
aboneliğini this
kaldırır.