Xamarin.Forms MessagingCenterXamarin.Forms MessagingCenter

Örnek indirin. Örneği indirinDownload Sample. Download the sample

Yayımla-abone ol stili, yayımcıların abone olarak bilinen alıcılar hakkında bilgi sahibi olmadan ileti gönderdikleri bir mesajlaşma modelidir.The publish-subscribe pattern is a messaging pattern in which publishers send messages without having knowledge of any receivers, known as subscribers. Benzer şekilde, aboneler herhangi bir yayımcılar hakkında bilgi sahibi olmadan belirli iletileri dinler.Similarly, subscribers listen for specific messages, without having knowledge of any publishers.

.NET 'teki olaylar, Yayımla-abone ol modelini uygular ve bir denetim ve onu içeren sayfa gibi gevşek bir bağlantı olması gerekmiyorsa bileşenler arasında bir iletişim katmanı için en basit ve kolay yaklaşımlar olur.Events in .NET implement the publish-subscribe pattern, and are the most simple and straightforward approach for a communication layer between components if loose coupling is not required, such as a control and the page that contains it. Ancak, yayımcı ve abone yaşam süreleri birbirlerine yönelik nesne başvuruları ile, abone türünün de Yayımcı türüne bir başvuruya sahip olması gerekir.However, the publisher and subscriber lifetimes are coupled by object references to each other, and the subscriber type must have a reference to the publisher type. Bu, özellikle statik veya uzun süreli bir nesne olayına abone olan kısa süreli nesneler olduğunda bellek yönetimi sorunları oluşturabilir.This can create memory management issues, especially when there are short lived objects that subscribe to an event of a static or long-lived object. Olay işleyicisi kaldırılmazsa, abone yayımcı içindeki buna başvuru tarafından etkin tutulur ve bu, abonenin çöp toplama işlemini engeller veya geciktirmez.If the event handler isn't removed, the subscriber will be kept alive by the reference to it in the publisher, and this will prevent or delay the garbage collection of the subscriber.

Xamarin.Forms MessagingCenter Sınıfı, Yayımla-abone ol ' u uygular, nesne ve tür başvurularına göre bağlantı için uygun olmayan bileşenler arasında ileti tabanlı iletişime izin verir.The Xamarin.Forms MessagingCenter class implements the publish-subscribe pattern, allowing message-based communication between components that are inconvenient to link by object and type references. Bu mekanizma, yayımcıların ve abonelerin birbirleriyle bir başvuruya sahip olmadan iletişim kurmasına olanak tanır ve bunlar arasındaki bağımlılıkları azaltmaya yardımcı olur.This mechanism allows publishers and subscribers to communicate without having a reference to each other, helping to reduce dependencies between them.

MessagingCenterSınıfı çok noktaya yayın yayımlama-abonelik işlevi sağlar.The MessagingCenter class provides multicast publish-subscribe functionality. Bu, tek bir ileti yayınlayan birden çok yayımcı olabileceği ve aynı iletiyi dinleyen birden çok abone olabileceği anlamına gelir:This means that there can be multiple publishers that publish a single message, and there can be multiple subscribers listening for the same message:

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

Yayımcılar yöntemi kullanarak iletiler göndererek MessagingCenter.Send , aboneler yöntemi kullanarak iletileri dinler MessagingCenter.Subscribe .Publishers send messages using the MessagingCenter.Send method, while subscribers listen for messages using the MessagingCenter.Subscribe method. Ayrıca, aboneler, gerekirse, yöntemi ile ileti aboneliklerinden de aboneliği kaldırabilirsiniz MessagingCenter.Unsubscribe .In addition, subscribers can also unsubscribe from message subscriptions, if required, with the MessagingCenter.Unsubscribe method.

Önemli

Dahili olarak, MessagingCenter sınıf zayıf başvurular kullanır.Internally, the MessagingCenter class uses weak references. Bu, nesneleri canlı tutamayacağı ve atık olarak toplanmasına olanak sağlayacak anlamına gelir.This means that it will not keep objects alive, and will allow them to be garbage collected. Bu nedenle, yalnızca bir sınıf artık iletiyi almayı istemiyorsa bir iletinin aboneliğini kaldırmak gereklidir.Therefore, it should only be necessary to unsubscribe from a message when a class no longer wishes to receive the message.

İleti yayımlamaPublish a message

MessagingCenter mesajlar dizelerdir.MessagingCenter messages are strings. Yayımcılar bir iletinin abonelerinden biri olan abonelere bildirir MessagingCenter.Send .Publishers notify subscribers of a message with one of the MessagingCenter.Send overloads. Aşağıdaki kod örneği bir ileti yayımlar Hi :The following code example publishes a Hi message:

MessagingCenter.Send<MainPage>(this, "Hi");

Bu örnekte, Send yöntemi göndereni temsil eden genel bir bağımsız değişken belirtir.In this example the Send method specifies a generic argument that represents the sender. İletiyi almak için bir abonenin aynı genel bağımsız değişkeni de belirtmesi gerekir ve bu da Bu gönderenden gelen bir iletiyi dinlediğini belirtir.To receive the message, a subscriber must also specify the same generic argument, indicating that they are listening for a message from that sender. Ayrıca, bu örnek iki yöntem bağımsız değişkenini belirtir:In addition, this example specifies two method arguments:

  • İlk bağımsız değişken, gönderen örneğini belirtir.The first argument specifies the sender instance.
  • İkinci bağımsız değişken iletiyi belirtir.The second argument specifies the message.

Yük verileri de bir iletiyle gönderilebilir:Payload data can also be sent with a message:

MessagingCenter.Send<MainPage, string>(this, "Hi", "John");

Bu örnekte, Send yöntemi iki genel bağımsız değişken belirtir.In this example, the Send method specifies two generic arguments. Birincisi iletiyi gönderen türdür ve ikincisi, gönderilen yük verilerinin türüdür.The first is the type that's sending the message, and the second is the type of the payload data being sent. İletiyi almak için bir abone aynı genel bağımsız değişkenleri de belirtmelidir.To receive the message, a subscriber must also specify the same generic arguments. Bu, ileti kimliğini paylaşan ve farklı aboneler tarafından alınmak üzere farklı yük veri türleri gönderen birden çok ileti sağlar.This enables multiple messages that share a message identity but send different payload data types to be received by different subscribers. Buna ek olarak, bu örnek aboneye gönderilecek yük verilerini temsil eden üçüncü bir yöntem bağımsız değişkenini belirtir.In addition, this example specifies a third method argument that represents the payload data to be sent to the subscriber. Bu durumda, yük verileri bir olur string .In this case the payload data is a string.

SendYöntemi, bir ateş ve unutma yaklaşımını kullanarak iletiyi ve tüm yük verilerini yayımlar.The Send method will publish the message, and any payload data, using a fire-and-forget approach. Bu nedenle, iletiyi almak için kayıtlı bir abone olmadığından bile ileti gönderilir.Therefore, the message is sent even if there are no subscribers registered to receive the message. Bu durumda, gönderilen ileti yok sayılır.In this situation, the sent message is ignored.

Bir iletiye abone olmaSubscribe to a message

Aboneler, aşırı yüklerden birini kullanarak bir ileti almak için kayıt yapabilir MessagingCenter.Subscribe .Subscribers can register to receive a message using one of the MessagingCenter.Subscribe overloads. Aşağıdaki kod örneğinde buna bir örnek gösterilmektedir:The following code example shows an example of this:

MessagingCenter.Subscribe<MainPage> (this, "Hi", (sender) =>
{
    // Do something whenever the "Hi" message is received
});

Bu örnekte Subscribe Yöntem, this nesneyi Hi türü tarafından gönderilen iletilere abone olur MainPage ve iletiyi almak için yanıt olarak bir geri çağırma temsilcisi yürütür.In this example, the Subscribe method subscribes the this object to Hi messages that are sent by the MainPage type, and executes a callback delegate in response to receiving the message. Lambda ifadesi olarak belirtilen geri çağırma temsilcisi, Kullanıcı arabirimini güncelleştiren, bazı verileri kaydeden veya başka bir işlemi tetikleyen bir kod olabilir.The callback delegate, specified as a lambda expression, could be code that updates the UI, saves some data, or triggers some other operation.

Not

Bir abonenin yayımlanan iletinin her örneğini işlemesi gerekmez ve bu, yöntemde belirtilen genel tür bağımsız değişkenleri tarafından denetlenebilir Subscribe .A subscriber might not need to handle every instance of a published message, and this can be controlled by the generic type arguments that are specified on the Subscribe method.

Aşağıdaki örnekte yük verileri içeren bir iletiye nasıl abone olunacağı gösterilmektedir:The following example shows how to subscribe to a message that contains payload data:

MessagingCenter.Subscribe<MainPage, string>(this, "Hi", async (sender, arg) =>
{
    await DisplayAlert("Message received", "arg=" + arg, "OK");
});

Bu örnekte, yöntemi, Subscribe Hi yük verileri bir olan türü tarafından gönderilen iletilere abone olur MainPage string .In this example, the Subscribe method subscribes to Hi messages that are sent by the MainPage type, whose payload data is a string. Bir uyarı içinde yük verilerini görüntüleyen bir ileti alma yanıtı olarak bir geri çağırma temsilcisi yürütülür.A callback delegate is executed in response to receiving such a message, that displays the payload data in an alert.

Önemli

Yöntemi tarafından yürütülen temsilci, Subscribe yöntemini kullanarak iletiyi yayımlayan aynı iş parçacığında yürütülür Send .The delegate that's executed by the Subscribe method will be executed on the same thread that publishes the message using the Send method.

İleti aboneliğini kaldırmaUnsubscribe from a message

Aboneler, artık almak istedikleri iletilerden aboneliği kaldırabilirsiniz.Subscribers can unsubscribe from messages they no longer want to receive. Bu, aşırı yüklerden biriyle sağlanır MessagingCenter.Unsubscribe :This is achieved with one of the MessagingCenter.Unsubscribe overloads:

MessagingCenter.Unsubscribe<MainPage>(this, "Hi");

Bu örnekte, Unsubscribe metodu nesnenin aboneliğini, this Hi türü tarafından gönderilen iletiden kaldırır MainPage .In this example, the Unsubscribe method unsubscribes the this object from the Hi message sent by the MainPage type.

Yük verileri içeren iletilerin, Unsubscribe iki genel bağımsız değişken belirten aşırı yükleme kullanılarak aboneliği kaldırılması gerekir:Messages containing payload data should be unsubscribed from using the Unsubscribe overload that specifies two generic arguments:

MessagingCenter.Unsubscribe<MainPage, string>(this, "Hi");

Bu örnekte, metodu, Unsubscribe this Hi yük verileri bir olan türü tarafından gönderilen iletiden nesnenin aboneliğini kaldırır MainPage string .In this example, the Unsubscribe method unsubscribes the this object from the Hi message sent by the MainPage type, whose payload data is a string.