2012-04-15 44 views
6

我是iOS開發新手,所以我希望得到一些反饋。模型和控制器之間的通信 - iOS

我想爲我的web服務構建一個iOS客戶端。到目前爲止,這是我所做的:

我正在實現兩個視圖(使用故事板的基於實用程序的應用程序)。在主視圖中,我使用文本字段和搜索按鈕,用戶可以在其中輸入查詢,然後單擊搜索按鈕。點擊搜索按鈕後,我的意圖是讀取文本字段的值,並在我的Web服務的Restful調用中使用它。我的網絡服務回覆一個帶有查詢結果的JSON文件,我將其解析並顯示到輔助視圖的文本區域。我知道如何做iOS中的restful調用,以及如何做JSON解析以及在屏幕上顯示結果(至少文本的東西,但這是另一個不同的問題)。但我的意圖是學習和實現MVC基礎到我的應用程序。

根據MVC,控制器更新視圖,模型發出控制器可以偵聽的通知廣播,並知道對象是否有任何更改。所以這就是我想要做的:

我的模型 - 我的模型將處理核心RESTful調用,獲取JSON回覆,解析它並獲取我想要在視圖上顯示的結果值。

我的控制器 - 我想我的控制器聽我的模型,並從模型中獲得結果值,並將其顯示在視圖上。

使用一個快速和骯髒的方式,我可以實現基於REST調用,JSON解析和顯示結果值 - 所有的控制器裏面,但這種技術,如果我的看法改變了,明天,我要重新寫我的代碼。或者如果我想添加新功能,那麼我必須更換我的控制器。因此,理想情況下,我希望擁有一個不知道View如何看起來像的核心Model,並讓Controller從Model獲取結果並將其顯示在View上。

從我迄今爲止從Google搜索結果中讀取的信息來看,這樣做的兩種方法是a)重要價值觀察和b)通知中心。

對於最近2天,我試圖找到一個很好的方式來實現通知中心或閱讀更多關於它,我沒有得到一個好的領導。我的一些問題是,我可以使用通知中心發送字符串結果值,我的控制器會提取?通知中心如何真正處理字符串值?我在哪裏可以找到一些很好的例子?

因此,任何有關這方面的幫助將非常感激。

+1

你真的希望你的MODEL處理與RESTful服務的通信嗎? – Till 2012-04-15 23:12:09

回答

12

一些我的問題是,我可以送出去的字符串中使用我的控制器拿起通知中心 值的結果嗎?

是的,通常使用userInfo屬性NSNotificationuserInfo是一個普通的NSDictionary,其中可能包含NSObject衍生對象的實例,該衍生對象通過遵守NSCopying協議(通常使用NSString)的密鑰索引。請注意,字典(userInfo)將保留您的參數對象。


如何通知中心真是字符串值工作?

那麼,這取決於你希望如何工作。但挑選一邊,見下文。


我在哪裏可以找到一些很好的例子?

也許這一個幫助...


的接收器(控制器)註冊爲通知:

- (void)registerForNotifications 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(modelObjectUpdatedString:) 
               name:@"StringUpdated" 
               object:nil]; 
} 

發件人(模型)通知世界:

- (void)stringUpdateWith:(NSString *)theString 
{ 
    self.string = theString; 
    [[[NSNotificationCenter defaultCenter] postNotificationName:@"StringUpdated" 
                 object:self 
                 userInfo:[NSDictionary dictionaryWithObjectsAndKeys:self.string, @"String", nil]]; 
} 

接收器(控制器)接收通知的處理程序中:

- (void)modelObjectUpdatedString:(NSNotification *)notification 
{ 
    ModelObject *postingObject = [notification object]; 
    NSString *string = [[notification userInfo] 
     objectForKey:@"String"]; 
    ... 
} 
+2

這是一個完美的答案。非常感謝您提供清晰簡潔的答案。這正是我所期待的。 – BlueChips23 2012-04-16 00:12:55

4

你沿着正確的路徑思考,但仍不能完全。正如Till在他的評論中「指出」的那樣,您不應該在模型中處理RESTful通信。如果我是你,我會創建一個負責獲取信息的工具類,然後創建一個負責保存數據的類(最後一個類是你的模型)。

創建一個類方法來分配和啓動從通過REST風格的通信器類獲取的JSON數據創建的此對象的新實例是很聰明的。

從視圖控制器點:

RESTHelper *rest = [RESTHelper restHelperWithURL:yourRESTURL]; 
YourModel *model = [YourModel modelWithJSON:[rest fetchObjectWithID:1]]; 
// Present your models data in the view. 

您可能會受益於這裏使用CoreData,我強烈建議您考慮這樣做。

+0

好的提示在這裏。感謝您指導我正確的方向。這些都是我希望得到的反饋,因爲我是iOS開發新手,我想在做任何複雜的應用程序之前就掌握基本知識。 – BlueChips23 2012-04-16 00:14:58

+0

除非遇到塊,KVO或委派不能執行此任務的情況,否則不應使用NSNotificationCenter。 – 2012-04-16 23:00:57

+0

嗨Rasmus,我也正在與IOS交手。 (對於OO來說並不新鮮)。那麼你會建議restHelper類在模型的協議上「回調」,一旦它獲得了一些數據?你能解釋爲什麼你使用[rest fetchObjectWithID:1]?我知道我在斯坦福大學的視頻中遇到過它,但似乎我摧毀了這些腦細胞...... – Greycon 2013-01-21 20:53:44

相關問題