2012-03-31 8 views
10

私は2種類のデータを持っていますが、いくつかは永続化する必要があり、そうでないものもあります。iPhone - viewControllerとネットワークリクエストのアーキテクチャ

私はすべてのネットワーク関連のコードをどこに置くか、私のUIViewController内で、すべてのネットワーク要求がどこから始まるのか、別のレイヤーを考えています。私が念頭に置いていた何

はこれです:

NetworkManagerと呼ばれる層を持っています。 NetworkManagerは私のすべてのWebサービスコールにシンガートンです。

ネットワーク管理者にリクエストを発行し、ローカルコアデータDBにレスポンスを保存させ、UIViewControllerFetchResultsControllerを使用してデータを聞かせてください。

しかし、他にも多くの種類のリクエストがあります。たとえば:ログイン要求、ユーザー情報要求、friendsNearByなど...一部はデータベースに永続性を持たせる必要はなく、FRCアーキテクチャに適合しないものもあります。リクエストのこれらのタイプの場合

は、私の知る限り見るように、それを処理する2つの方法があります。

1.はViewControllersとNetworkManagerの間で分離し、別の層を有します。 Mediatorとしましょう。 Mediatorは、networkManagerから辞書(JSON)リクエストを取得し、アプリケーションロジックに従ってそれ以外のことが必要な場合は、適切な名前とデータで通知を送信します。メディエータが要求を発行したUIViewControllerを保存する場合、通知を送信するのではなく、直接応答を委任することができます。

の流れは次のようになります:

MyUiViewController - > Mediator -> NetworkManger->Mediator-> PostNotification (or directly back to MyUiViewController) 

Pros: 
Decoupling 
Nice structure and separation of concerns 

Cons: 
Harder to code 
Sometimes harder to understand and debug. 

2.ブロックとのネットワーク要求を発行し、この3階層アーキテクチャを有するが、代わりにMyUiViewControllersを持っていません。 MediatorがMyUiViewControllerの前に応答を傍受するのではなく、MyUiViewControllerがブロックを使用してレスポンスを処理するようにします。

Pros: 
Simple and quick to code 
Easy to understand 

Cons: 
Coupling of network code inside your controllers 

私は人々の経験から最善のものについての提案やコメントを得ることを望ん、またはこれを行うの他の/より良い方法ました。

答えて

1

すでに最適な方法がありますか?

はここ

はシングルトンではないのNetworkManagerを持って、私は一般的に何をすべきかです。メソッドOnSuccess、OnErrorを使用してプロトコルを定義します。ネットワーク接続を開始するViewControllerでこれを実装します。 NetworkManager上にデリゲートを設定し、非同期要求が実行されたときにデリゲートを呼び出させます。

ブロックではなく代理人をメンテナンスしやすいように使用します。

これは最善の解決策ではないかもしれませんが、うまくいけばいくつかの指針を与えます。

1

オプション2には、オプション1のリストを少しお勧めします。私のアプリケーションでは、同時に動作する2つの異なる動作モードがある傾向があります。

自動ダウンロード: アプリの重要なデータがダウンロードされ、データベースに直接保存されます。アプリがアクティブになるたびに開始されます。各要求が完了すると、新しいデータについて知る必要のある可視のView Controllerに対してNSNotificationが送出されます。

たとえば、プレーヤーのデータを保存すると、「PlayerDataUpdated」のような通知が送信されます。ビューコントローラが表示されていると、通知を待ち受けます。表示されていないときは、データベースへの変更がviewWillAppearの間に検出されるため、通知を受信しません。

ユーザー主導のダウンロード:リフレッシュするためにそのようなプルなど、ユーザーが開始ネットワーク要求について 、更新されたデータを必要とするビューコントローラからのNetworkManagerの適切なメソッドを呼び出す必要があります。

関連する問題