Поиск…


Управление пользовательским интерфейсом из фоновых потоков

Фоновые потоки не могут изменять пользовательский интерфейс; почти все методы UIKit должны быть вызваны в основной поток.

Из подкласса NSObject (включая любой UIViewController или UIView ):

InvokeOnMainThread(() =>
{
    // Call UI methods here
});

Из стандартного класса C #:

UIApplication.SharedApplication.InvokeOnMainThread(() =>
{
    // Call UI methods here
});

InvokeOnMainThread ждет, пока ваш код будет запущен в основном потоке для выполнения перед продолжением. Если вам не нужно ждать, используйте BeginInvokeOnMainThread .

Использование Async и ожидание

Вы можете использовать методы async для обработки асинхронных исполнений. Например, запросы POST и GET. Скажем ниже, это ваш метод получения данных.

Task<List> GetDataFromServer(int type);

Вы можете вызвать этот метод, как показано ниже

var result = await GetDataFromServer(1);

Однако в реальной практике этот метод будет находиться в интерфейсе уровня сервиса. Там лучший способ сделать это - создать отдельный метод для вызова этого и обновить пользовательский интерфейс, показанный ниже.

//Calling from viewDidLoad
void async ViewDidLoad()
{
    await GetDataListFromServer(1);
    //Do Something else
}

//New method call to handle the async task
private async Task GetArchivedListFromServer(int type)
{
    var result = await GetDataFromServer(type);
    DataList.AddRange(result.toList());
    tableView.ReloadData();
}

В приведенном выше фрагменте кода будет вызван метод GetDataListFromServer и он отправит веб-запрос. Тем не менее, он не будет блокировать поток пользовательского интерфейса, пока он не получит ответ от сервера. Он будет двигаться вниз по линии после await GetDataListFromServer(1) . Однако внутри метода private async Task GetArchivedListFromServer(int type) он будет ждать, пока он получит ответ от сервера, чтобы выполнить строки после того, как var result = await GetDataFromServer(type); ,



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow