2

編輯:我的最終目標是完全解耦ASIHTTPRequestModelListingViewController,這樣我就可以做self.modelArray = [Model arrayOfModelWithDelegate:self],並且可能實現一些我自己的回調而不是ASI。此設計是訪問MVC時尚Web服務的好方法嗎?

我製作了幾款利用RESTful服務和ASIHTTPRequest的iPhone應用程序。我從未對它們的設計感到滿意,因爲我總是覺得解析,模型和視圖控制器類是緊密耦合的。我的下一個應用的更新,我想利用這個設計Web服務訪問:

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

self.arrayOfModel = [Model arrayOfModelWithDelegate:self];

這種設計看起來有點不妥,特別是在如何連接ModelWSControllerWSController,但我不知道是什麼。具體而言,連續兩次下跌環比似乎是離奇的。

輸入是讚賞,我想知道你是如何設計使用MVC原則訪問RESTful Web服務。另外,請讓我知道如果塊是一個更好的方式來處理這個問題。

+0

讓我們試着讓這個問題得到解答。我不能完全說出什麼是錯的。但從你的帖子我發現你的模型是本地的,但也是遠程(平靜的服務)。它是否正確? 你還談到了多個控制器? – 2012-08-26 23:02:18

回答

1

.NET應用程序的體系結構大概可以在這裏應用。通常,在服務調用和控制器之間添加應用程序服務層。它類似於命令/執行程序模式,其中應用程序服務層的職責是實現與外部服務的接口。

一個很好的例子是試圖編寫一個通用的天氣服務,可以從谷歌和雅虎的天氣消費。您的目標應該是將這兩項服務都實施到通用合同,在這種合同中,簡單的配置更改會將谷歌天氣轉換爲雅虎天氣。你的應用依賴於接口,而不是實際的實現。

iOS的依賴注入框架如Objection有助於使配置更改很小。