Xamarin.iOS
Xamarin.iOS에서의 동시 프로그래밍
수색…
백그라운드 스레드에서 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);
.