수색…


백그라운드 스레드에서 UI 조작

백그라운드 스레드는 UI를 수정할 수 없습니다. 거의 모든 UIKit 메서드는 주 스레드에서 호출되어야합니다.

NSObject (모든 UIViewController 또는 UIView 포함)의 하위 클래스에서 :

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

표준 C # 클래스에서 :

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

InvokeOnMainThread 는 주 스레드에서 실행중인 코드가 실행되기 전에 실행될 때까지 기다립니다. 기다릴 필요가없는 경우 BeginInvokeOnMainThread 사용하십시오.

비동기 사용 및 대기

async 메소드를 사용하여 비동기 실행을 처리 할 수 ​​있습니다. 예를 들어 POST 및 GET 요청. 다음은 데이터 가져 오기 방법입니다.

Task<List> GetDataFromServer(int type);

다음과 같이 해당 메소드를 호출 할 수 있습니다.

var result = await GetDataFromServer(1);

그러나 실제 연습에서는이 방법이 서비스 계층 인터페이스에있게됩니다. 거기에 가장 좋은 방법은 이것을 호출하고 UI를 업데이트하는 별도의 메소드를 만드는 것입니다.

//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 메서드가 호출되고 웹 요청을 보냅니다. 그럼에도 불구하고 서버에서 응답을받을 때까지는 UI 스레드를 차단하지 않습니다. await GetDataListFromServer(1) 후 라인을 아래로 이동합니다. 그러나 private async Task GetArchivedListFromServer(int type) 메소드 내부에서는 var result = await GetDataFromServer(type); 이후에 행을 실행하기 위해 서버에서 응답을받을 때까지 대기합니다 var result = await GetDataFromServer(type); .



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow