Как остановить центр обмена сообщениями, чтобы прекратить подписку несколько раз в Xamarin.Forms?

Я создаю приложение, и ему нужно отправить аргумент на другую страницу и отправить аргумент с помощью MessagingCenter, когда я отправляю с помощью MessagingCenter, он вызывается более одного раза.

Если я использую отписаться, чем в следующий раз, он не будет получен в следующий раз.

MessagingCenter.Send(this, "Invoke", "Invokedtrue");

MessagingCenter.Subscribe<MyPage, string>(this, "Invoke", async (sender, arg) =>
{
    await Process(arg);
});
MessagingCenter.Unsubscribe<MyPage>(this,"Invoke");


**ListPage**

    private void ViewCell_Tapped(object sender, EventArgs e)
    {
        try
        {
            MessagingCenter.Send(this, "Invoke", "Invokedtrue");
        }
        catch (Exception ex)
        {
            Debug.Write(ex);
        }
    }

**Detail Page**

    MessagingCenter.Subscribe<ListPage, string>(this, "Invoke", async (sender, arg) =>
    {
        await Process(arg);
    });

    private async Task Process(string arg)
    {
        //Here is api call to view detail of particular record

        //Here I unsubscribe the MessagingCenter.
        MessagingCenter.Unsubscribe<ListPage>(this,"Invoke");
    }

Я хочу отправить только один раз, используя подписку и отправить только один раз.

Может ли кто-нибудь изучить это и предложить мне, что я должен делать в этом?

Вы говорите, что подписка повторяется несколько раз на второй странице?

Bruno Caceiro 13.06.2019 16:26

вы уверены, что не звоните отправить или подписаться несколько раз? Кроме того, аргументы, которые вы используете в Send<T1,T2>, должны совпадать с аргументами, которые вы используете при вызове Subscribe<T1,T2>.

Jason 13.06.2019 16:26

Привет @Jason Да, я уверен, что я нажимаю только один раз, но подписываюсь более одного раза. Поэтому процесс выполнения занимает слишком много времени. Не могли бы вы предложить, что мы должны сделать в этом?

Deep Soni 14.06.2019 06:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
3
1 879
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы хотите отправить и получить сообщение только один раз? Затем вы можете использовать метод Unsubscribe после получения сообщения. Например, вы можете сделать так:

 MessagingCenter.Subscribe<MyPage, string>(this, "Invoke", async (sender, 
   arg) =>
{
await Process(arg); 
MessagingCenter.Unsubscribe<MyPage>(this,"Invoke");
});

Обновлено:

На DetailPage вы можете вызвать MessagingCenter.Subscribe в методе OnAppearing() и вызвать MessagingCenter.Unsubscribe в методе OnDisappearing следующим образом:

protected override void OnAppearing()
    {
        base.OnAppearing();
       MessagingCenter.Subscribe<ListPage, string>(this, "Invoke", async (sender, arg) =>
        {
            Debug.Write("123456---->  get one msg");
            DisplayAlert("Alert", "We have received a message.", "OK");
        });
    }

    protected async override void OnDisappearing()
    {
        base.OnDisappearing();
        MessagingCenter.Unsubscribe<ListPage,string>(this, "Invoke");
    }
}

На ListPage

async void OnTap (object sender, EventArgs e)  
    {
        await Navigation.PushAsync(new DetailPage());
        try
        {

            MessagingCenter.Send(this, "Invoke", "Invokedtrue");

            Debug.Write("123456---->  send one msg");

        }
        catch (Exception ex)
        {
            Debug.Write(ex);
        }

    }

Примечание: когда вы входите в ListPage, вы можете попробовать следующий код:

  MainPage = new  NavigationPage( new ListPage());

Эффект в IOS:

Ссылка на полное демо — здесь, можете посмотреть.

Я пытался с этим, но когда пользователь нажимает второй раз, он также не получает подписку на моей странице. Не могли бы вы дать другое лучшее решение?

Deep Soni 14.06.2019 06:08

@DeepSoni Вы хотите снова получить сообщение после этого? Механизм MessagingCenter заключается в том, чтобы отправить один раз и получить один раз, если вы не отмените подписку. Не могли бы вы поделиться дополнительным фрагментом кода о MessagingCenter в вашем приложении?

Jessie Zhang -MSFT 14.06.2019 08:01

Я добавляю свой код в вопрос, не могли бы вы изучить это и предложить мне, что я должен изменить?

Deep Soni 14.06.2019 10:42

@DeepSoni Я обновил ответ, вы можете проверить его.

Jessie Zhang -MSFT 14.06.2019 12:15

Спасибо за ответ. Я попробовал ваш код и отлично работает на android, но когда я перемещаю платформу на iOS, у меня это не работает. Не могли бы вы проверить и поделиться возможным способом, который хорошо работает на обеих платформах.

Deep Soni 20.06.2019 07:30

@DeepSoni С MessagingCenter все в порядке. На что нам нужно обратить внимание, так это на push- и pop-стили страницы. Я обновил ответ, вы можете проверить его.

Jessie Zhang -MSFT 20.06.2019 09:39

Спасибо за ответ. Позвольте мне попробовать ваш обновленный код на обеих платформах.

Deep Soni 24.06.2019 15:58

Я пробовал то, что вы упомянули, но подписка вызывается дважды.

Divyesh_08 16.04.2021 12:02

Другие вопросы по теме