2

wsdl2objcで生成されたコードでSOAPを使用しています。Webサービスによって提供されるデータを共有する必要がある複数のViewControllerがあります。データモデルの部分が欲しいのですが、どうしたらいいのかわかりません。当然、呼び出しは非同期である必要があります。私の質問は、ベストプラクティスは何でしょうか?データのフェッチは誰が担当する必要がありますか?誰がデータを保存する必要がありますか?並行性を処理する方法は?どんな考えでもいただければ幸いです!

更新:CoreDataの使用を検討していましたが、データが頻繁に更新されるときにどのようなメリットがあるのか​​わかりませんでした。私の最大の問題は、View Controllerがモデルからデータを要求するが、データが利用できないシナリオをどのように処理するかです。これは、低速のWebサービス呼び出しを実行し、データが入ったときに何らかの方法でView Controllerに通知することを意味します。通知センターはここに行く方法ですか?流れはどうですか?ビューコントローラは常に更新通知をリッスンする必要がありますか?私の考えでは、ビューコントローラーはオブザーバーとして登録し、モデルからのデータをビューに入力し(空のデータに関係なく)、受信した通知を自動的に更新します。つまり、「最新の」データを持つモデルからデータをフェッチします。利用可能。これにより、すべてのネットワーク呼び出しがViewControllerから除外されます。ビューコントローラが共有データにアクセスできるようにします。考え?

4

2 に答える 2

3

更新された質問では、はい、通知センターは、新しいデータが利用可能になったときにバックグラウンドネットワークタスクがViewControllerを更新するのに最適な方法だと思います。

あなたが尋ねる:

ビューコントローラは常に更新通知をリッスンする必要がありますか?

ある種。「常にリッスンしている」という用語は、常に更新をチェックしていることを意味する場合があります。明らかに、それは実際にはそれを行っていません(または、もっと重要なことに、あなたはそれをしたくないのです)。むしろ、それは単にその通知のオブザーバーとして自分自身を登録します(そして、ビューが却下されたときに、自分自身も登録解除することを確認してください)。そうすれば、カスタム通知のいずれかが通知されますが、「常にリッスン」しているCPUサイクルの多くを無駄にすることはありません。

その後、フォローアップして質問します。

私の考えでは、ビューコントローラーはオブザーバーとして登録し、モデルからのデータをビューに入力し(空のデータに関係なく)、受信した通知を自動的に更新します。つまり、「最新の」データを持つモデルからデータをフェッチします。利用可能。これにより、すべてのネットワーク呼び出しがView Controllerから除外され、ViewControllerが共有データにアクセスできるようになります。考え?

基本的に、はい、それはいいですね。これに対する私の唯一のわずかな改良点は、アプリをストアに公開した時点での最新のデータをアプリデータベースに事前入力することです。そうすれば、アプリが最新のデータを取得している間、ユーザーは何かを見ることができます。おそらくそれはあなたのシナリオでは有効ではありませんが、アプリが最新で最高のものを取得している間、何もないよりも(少し古くなっていても)ユーザーに何かを見せたほうがよい場合がよくあります。

最後に(そしておそらくすでにこれを検討しているでしょう)、データがバックグラウンドでダウンロードされていることを視覚的に示すものをユーザーに提示するようにします。おそらく、適切に配置されたUIActivityIndicatorView(つまり、スピナー)またはUIProgressViewUIRefreshControlおそらく、テーブルビューを扱っている場合は、ダウンロードが進行中であることを示すためにのテキストを更新してください。おそらく、ステータスバーのネットワークアクティビティインジケータも更新します。


これには誰もが独自のアプローチを持っていると思いますが、データ取得プロセスが複雑で、完全に非同期で行われ、ダウンロード/処理の進行中にアプリが通常どおり続行できるというアプリでの私が行ったことについてのいくつかの観察結果があります:

  1. 標準モデル、ビュー、およびビューコントローラークラスに加えて、結果のダウンロードと解析を行う別個の「xmlコントローラー」がありました。非同期でダウンロードを開始しました。

  2. xmlコントローラーとviewコントローラー間の通信を容易にするために、通知を使用しました。このようにして、xmlコントローラーはダウンロード/解析プロセスの特定のフェーズの開始と完了に関する通知を投稿します。ビューコントローラは、更新プロセス中に信頼性がない場合、オプションで開始時にスピナーを表示したり、特定のダウンロード/解析フェーズの完了に応じて更新したりすることができます。アプリケーション層の同時実行性の問題をすべて実際に特定するには、注意が必要です。すべてのステップで、「このためのモデルデータがバックグラウンドキューで変更された場合はどうなるか」という論理的なシナリオを処理する必要があります。

    結論として、非同期更新を行う場合、防御的なプログラミングがその日のルールです。最近、すぐにでも有効なものを取得したからといって、それを仮定することはできません。私たちがコードで簡単に行う仮定の多くは、もはや成り立たなくなります。また、何らかのインデックスに基づく操作(「5番目のアイテム」など)にはもっと注意を払い、キーベースの操作(「一意の識別子が4027のアイテム」など)に確実に傾倒します。

  3. データベース層の同時実行性の問題に関しては、永続ストレージの性質に少し依存します。Core Dataを使用している場合は、同時実行性について説明しているWWDC2012-214のCoreDataのベストプラクティスを確認してください。または、 『Core Dataプログラミングガイド』の「 CoreDataとの同時実行」を参照してください。SQLiteを使用する場合、簡単な解決策の1つは、 FMDBなどのデータベース操作専用のシリアルキューを用意することです。ちなみに、この後者のアプローチを使用する場合は、データベースの相互作用を可能な限り最小の操作に分割して、データベースが拘束されないようにする必要があります。 FMDatabaseQueue

  4. 非同期のダウンロード/更新プロセスの進行状況をユーザーに通知したい場合は、そのためのフレームワークについて検討することをお勧めします。一部のアプリは、ステータスバーのネットワークアクティビティインジケーターと同じくらい簡単なことをします。他の人は、いくつかの共同ナビゲーションバーのいくつかのステータスメッセージを更新します。また、通知にカスタムコンテナを使用しているため、すべてのViewControllerに「ユーザーステータスの更新を表示する」を追加する必要はありません。ここにはたくさんのアプローチがありますが、各ビューコントローラーにステータス更新コードを含める必要があるソリューションはおそらく避けてください(ビューコントローラーがバックグラウンドキューによって変更されている現在のアイテムに依存している場合を除きます)。この場合、ステータス更新の問題ではなく、アプリケーションフローの問題です)。

于 2013-02-16T15:55:08.470 に答える
0

iOSアプリケーションから直接SOAPを使用することは、SOAPエンベロープのオーバーヘッドのため、あまり最適ではありません。代わりにRESTXML/JSONサービスを使用することをお勧めします。

JSON / XMLサービスがない場合は、バックエンドモバイルプラットフォームを使用して、バックエンドで複雑なSOAPプロトコルを処理し、フロントサイドで軽量で処理しやすいREST/JSONを使用できます。

一部の「エンタープライズ向けオープンソースモバイルアプリケーション開発プラットフォーム」は、これらのタイプのサービスを提供します。

于 2013-02-18T12:35:17.137 に答える