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:

Çok noktaya yayın yayımlama-abone olma işlevi

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 stringolur.

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 stringolan 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 thisHi 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 stringolan türü tarafından gönderilen iletideki Hi nesnesinin MainPage aboneliğini this kaldırır.