Могу ли я изменить пользовательский интерфейс из метода, который получает данные (не асинхронные), которые были вызваны с помощью await? - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть этот код:

    protected override async void OnAppearing()
    {
        base.OnAppearing();            
        Subscribe();
        vm.IsBusy = true;
        if (Change.firstTimeCardsTab == true)
        {
            SetButtons(Settings.cc.ShortText());
            await Task.Run(() => GetOnAppearingData());
        }
    }

    private void GetOnAppearingData()
    {
        App.DB.GetData();
        AddDetailSection();
        SetPageDetails();
        Change.firstTimeCardsTab = false;
        vm.IsBusy = false;
    }

vm.IsBusy = true; показывает индикатор активности на странице и vm.IsBusy = false; Я бы надеялся выключить его.

Однако, когда я запускаю код, я получаю сообщение:

Ошибка согласованности UIKit: вы вызываете метод UIKit, который может только быть вызванным из потока пользовательского интерфейса.

Может ли кто-нибудь дать мне совет о том, как установить индикатор активности для отображения, затем получить данные, а затем установить их не показывать? Обратите внимание, что AddDetailSection (); добавляет некоторые элементы в XAML. Может ли это быть проблемой?

1 Ответ

0 голосов
/ 01 сентября 2018

Пользовательским интерфейсом можно манипулировать только из основного потока. Существует метод Device.BeginInvokeOnMainThread(Action), который может помочь решить вашу проблему, более подробную информацию можно найти в официальной документации .

Просто оберните все связанные с ним действия:
Device.BeginInvokeOnMainThread(() => { SetPageDetails(); // Any other actions });

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...