Xamarin.Forms MessagingCenter

Download Sample Örneği indirme

Yayımla-abone ol düzeni, yayımcıların abone olarak bilinen hiçbir alıcı hakkında bilgi sahibi olmadan 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 basit yaklaşımdır. Ancak, yayımcı ve abone yaşam süreleri birbirine yapılan nesne başvuruları ile birleştirilir 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 süreli 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ğlanması uygun olmayan 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ın azaltılmasına yardımcı olur.

sınıfı çok MessagingCenter noktaya yayın yayımla-abone ol 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:

Multicast publish-subscribe functionality

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

Sınıfı dahili MessagingCenter olarak zayıf başvurular kullanır. Bu, nesneleri canlı tutmayacağı ve bunların çöp toplamasına izin edeceği anlamına gelir. Bu nedenle, yalnızca sınıf artık iletiyi almak istemediğinde ileti aboneliğini kaldırmanız gerekir.

İleti yayımlama

MessagingCenter iletileri dizedir. 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öntem, 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 ve bu bağımsız değişkenin gönderenden gelen bir iletiyi dinlediğini belirtmesi gerekir. Ayrıca, bu örnekte iki yöntem bağımsız değişkeni belirtmektedir:

  • İ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 de 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ı yük veri türleri gönderen birden çok iletinin farklı aboneler tarafından 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şkenini 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 olan türü tarafından MainPage gönderilen iletilere stringabonedirHi. Geri çağırma 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 aboneliği iki genel bağımsız değişken belirten aşırı yükleme kullanılarak Unsubscribe 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 iletiden Hi nesnenin MainPage aboneliğini this kaldırır.