6

典型的な RESTful iOS アプリを見てみましょう。連絡先アプリとしましょう。メイン画面は連絡先のリストで、連絡先をタップすると連絡先の詳細画面が表示されます。

連絡先リストは REST API を介して取得され、連絡先の詳細は別の API を介して取得されます。

これらの API への呼び出しをトリガーするためにどのイベントを使用しますか?

  • 両方のView ControllerでviewDidAppear
  • 両方のView ControllerでviewWillAppear
  • メイン ビュー コントローラーから、pushViewController:detailViewController を呼び出す前に連絡先詳細 API を呼び出します。
  • 他のイベントは?

現在、私は主にこの種のシナリオで viewWillAppear を使用しており、いくつかの特定のケースでは viewDidAppear を使用していますが、コーディングの慣行を標準化するために、これらのさまざまなアプローチの長所と短所を確実に解決したいと考えています。

4

3 に答える 3

3

それは部分的に好みの問題です。API 呼び出しによって不明な遅延が発生するため、アプリはビジーであることを示す UI を表示する必要があります。私の好みは、リクエストの前にできる限り多くのことを UI に行わせることです。(私の単純な認識モデルでは、新しい VC がデータをフェッチしているときに UI を見ると、ユーザーの頭が一瞬だけ占有され、遅延がはるかに短く見えるというものです)。

したがって、詳細 VC でフェッチされる連絡先の ID など、要求を説明する VC のパラメータを優先し、viewDidAppear で要求を実行します (データがまだキャッシュされていないか、更新が必要な場合)。そのメソッドでは、フェッチが行われていることを示す UI を配置して、次の形式をとります。

- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];

    if (/* i don't have my model or it's out of date */) {
        // put up 'i am busy' UI
        MyRequestClass *request = // form a request that fetches my model
        [request runWithBlock:^(id result, NSError *error) {
            // i build my request classes to run with blocks simplifying the caller side
            // if it's a json request, then pass a parsed result back to this block
            // remove 'i am busy' UI
            if (!error) {
                // init my model from result
                // other parts of this class observe that the model changes and updates the UI
            } else {
                // present error UI
            }
        }];
    }
}
于 2013-01-28T23:32:43.350 に答える
1

まず、API インターフェイスとデータ アクセスが別のデータ アクセス クラス (またはデータ コントローラー - 既に行っている場合は謝罪し、この段落は無視してください) のビュー コントローラーの外部で発生していることを確認することをお勧めします。iPad 固有のビューを作成したい場合や、後で何らかの方法で UI を改良する必要がある場合に、ネットワーク コードを View Controller に直接配置することは非常に困難になるため、避ける必要があります)。

邪魔にならないので、いくつかのオプションがあります。ユーザーの観点から見たパフォーマンスに関しては、RESTful API からできるだけ多くをプリフェッチするのが最善です。これはAFIncrementalStore、API を Core Data にマップするようなライブラリがやろうとしていることです。しかし、何千もの連絡先があり、レートが厳しく制限されているか、帯域幅が制限されている場合、これは問題になります.

ユーザーが経験する遅延を最小限に抑えるために、できるだけ早くネットワーク API を呼び出す必要があることは確実です。この場合は、使用viewDidLoadするよりもviewWillAppear使用viewDidAppearする方が良いかもしれません: ローディング/ホールド グラフィックまたはアニメーションを使用してビューを設定し、非同期ネットワーク呼び出しをトリガーし、完了したら必要な情報を表示できます。

于 2013-01-28T23:37:16.563 に答える
0

私は通常これを行います:

viewWillAppear で連絡先を読み込みます。プルして更新する場合は、それが発生したときに行います。

ユーザーがセルをタップすると、そのイベントを処理するメソッドでイベントの詳細を読み込み、そのオブジェクトを連絡先の詳細コントローラーのコンストラクターに渡し、プッシュします。

于 2013-01-28T23:32:05.573 に答える