2017-02-06 12 views
0

私は自分のViewControllerにUITableViewを持っています。データを入力するには、asyncリクエストを完了する必要があります。どこに置くべきですか?原因ViewDidLoadからのすべてのコードがまだ実行されたではないという事実のために - それはまだ割り当てられていなかったいくつかの要素を配置しようとするため、私はViewDidLoad非同期を作成し、そこから電話を作ってみましたUITableViewを配置する場所はどこですか?

ViewWillLayoutSubviewsは、エラーがスローされます(おもう)。

+0

データを取得した後、何をしますか?たとえば、UIを更新します。 – Lumialxk

+0

はい、私は '_tableView.Source = ...; _tableView.ReloadData(); ' – nicks

答えて

2

ViewDidLoadで待っている前に、すべてのビューロジックを設定する必要があります。そうしないと、ViewDidLoadメソッドが返されたときにビューの初期化が完了しません。これが原因で、ViewWillLayoutSubviewsが失敗する可能性があります。それでも失敗する場合は、サービスが動作していることを確認するためにtry/catchを使用してください:

public override async void ViewDidLoad() 
{ 
    base.ViewDidLoad(); 

    // setup all the view elements here (before the async call) 

    try 
    { 
     var results = await MakeYourAsyncRequest(); 

     InvokeOnMainThread(() => 
     { 
      _tableView.Source = ...; // do something with the results 
      _tableView.ReloadData(); 
     }); 
    } 
    catch(Exception ex) 
    { 
     // do something with the exception 
    } 
} 
+0

大丈夫です。 'ViewDidLoad'を' async'にするのではなく 'Task.Run'と' InvokeOnMainThread'をなぜ使用しているのですか? – nicks

+0

基本的に、ViewDidLoadはiOSによって定義され呼び出されたメソッドであり、非同期ではありません。 C言語で非同期にすることは、iOSがそれを待つことを意味しません。そのため、 'ViewWillLayoutSubviews'が失敗する可能性があります。 – xleon

+0

あなたはその情報のソースを提供できますか? – nicks

0

tableView.ReloadData();これはあなたの問題を解決する可能性があります

dispatch_async(dispatch_get_main_queue()、^ {}方法

- :一般的なルールとして、あなたはUIの相互作用のすべてが起こることを確認してみてくださいあなたは危険なようで、あなたの バックグラウンドスレッドからリロードデータを呼び出していたようタスクがバックグラウンドで動作しますフェッチをメインスレッド。そして、あなたのデータに。それは見えた。

0

データに応じて、私は、呼を置きますAppDelegate。アプリが起動すると、データを取得して保存する必要があります。

UITableviewが表示されている場合は、すでにデータの準備ができているか、フェッチの結果がわかっているのでエラーメッセージが表示されます。

データが変更されることがあります。ViewControllerviewWillAppear()にフェッチコールをUITableviewで置き換える理由があります。

ViewDidLoad()は、一度だけ呼び出されるメソッドです。また、ViewControllerライフサイクルの最初のメソッドとして呼び出されます。 あなたはそれについて少しお読みになるといいでしょうVC lifecycle。 コードで試してみてください。printf("method name").

+0

私は、AppDelegateのデータを取得することは、あなたがアプリの初期化のために必要としない限り、本当に面倒だと思います。あなたに20のView Controllerがあり、それぞれが非同期要求を行っているとします。 AppDelegateでこれらのリクエストをすべて行いますか? – xleon

+0

私はあなたに@xleonに同意します。彼のユースケースのシナリオはわかりません。私はあなたが述べたように、またはデータが重要だが、ユーザーがアプリケーションを使用しないときに変更される可能性がある場合にのみ、私はそれをapp initのために必要とする。 – Darkwonder

関連する問題