2

EDIT:ASIHTTPRequestModelListingViewControllerを完全にデカップリングして、self.modelArray = [Model arrayOfModelWithDelegate:self]を実行し、ASIのコールバックではなく、自分のコールバックを実装することを究極の目標としています。このデザインはMVC形式でWebサービスにアクセスするのに適していますか?

私は、RESTfulなサービスとASIHTTPRequestを利用するいくつかのiPhoneアプリを作りました。私は、解析、モデル、およびビューのコントローラクラスが緊密に結合されているといつも感じているので、それらがどのように設計されているかには満足していません。

ModelListingViewController --- self ---> Model +(NSArray*)arrayOfModelWithDelegate:MLVC 

+(NSArray*)arrayOfModelWithDelegate ---> ModelWSController:WSController +(NSArray*)getAllModel 

WSController中:

@property (nonatomic, strong) ASIHTTPRequest *request; 
... 
- (void)performRequest { 
    //global request stuff, like authentication, headers, etc 
    [request startAsynchronous]; 
} 

ModelWSController中:

- (NSArray *)getAllModelWithDelegate:(id)delegate { 
    request.url = @"Appropriate URL"; //or could use a more sophisticated internal url routing system defined by model class name 
    request.delegate = delegate; 
    [ModelWSController performRequest]; 
} 

ModelListingViewControllerで私の次のアプリのアップデートのために、私は、Webサービスにアクセスするためのこの設計を使用したいです:

self.arrayOfModel = [Model arrayOfModelWithDelegate:self];

このデザインでは、特にModelWSControllerWSControllerがどのようにインターフェイスされているかに問題がありますが、何がわかりませんか。具体的には、delegateのチェーンを2回通過することは奇妙なようです。

入力がうまくいき、RESTful WebサービスにアクセスするためにMVCの原則をどのように使用して設計したかを知りたいと思います。また、ブロックがこれを処理するより良い方法であるかどうかを私に教えてください。

+0

この質問に回答することができます。私は間違っていることを完全に言うことはできません。しかしあなたのポストから、あなたのモデルはローカルであると考えられましたが、リモート(安静なサービス)でもあります。これは正しいです? 複数のコントローラについてもお話ししますか? –

答えて

1

.NETアプリケーションのアーキテクチャは、おそらくここで適用できます。通常、サービスコールとコントローラの間にアプリケーションサービスレイヤーを追加します。これはコマンド/実行プログラムのパターンに似ていますが、アプリケーションサービス層の責任は外部サービスへのインタフェースを実装することです。

良い例は、GoogleとYahooの両方の天気から消費することができる一般的な天気予報サービスを作成することです。あなたの目標は、シンプルな設定変更がGoogleの天気をYahooの天気に切り替える共通の契約に両方のサービスを実装することです。あなたのアプリは実際の実装ではなくインターフェースに依存しています。

iOSの依存性注入フレームワークは、Objectionのように、その設定を非常に小さなものに変更するのに役立ちます。

関連する問題