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
使用しBeginInvokeOnMainThread
。
非同期と待機を使用する
非同期メソッドを使用して、非同期実行を処理できます。例えば、POST要求とGET要求。あなたの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メソッドが呼び出され、Webリクエストが送信されます。それにもかかわらず、サーバーからの応答を得るまでUIスレッドをブロックしません。それはawait GetDataListFromServer(1)
てからラインを下に移動します。しかし、 private async Task GetArchivedListFromServer(int type)
メソッドの中では、 var result = await GetDataFromServer(type);
後に行を実行するためにサーバからの応答を取得するまで待機しますvar result = await GetDataFromServer(type);
。