2012-02-01 94 views
1

我有更新的數據訪問量:iPhone:從插座

  1. 委託來處理套接字連接,讀取和插座上寫入數據。

  2. MyTableViewController與方法來填充表與從插座接收到的數據的圖。

我的問題是:

什麼將一個有效的設計方法是,以填補在插座數據到達了表? (考慮到將來我會有其他幾個觀點也使用來自插座的數據。)

我想我應該有一個單一的SocketClient類來處理所有的消息通過套接字交換,然後通知各相關UIViewController。但是,在這種情況下,當數據到達套接字時,控制器對象已經實例化。這導致我將控制器用作單例。它有效,但我不喜歡這個。另一種方法是將我的所有控制器作爲處理套接字連接的委託。我也不喜歡這個。

你的方法是什麼?

回答

2

這裏正確的做法被稱爲模型 - 視圖 - 控制器,它是在Cocoa的核心架構。該模型保存您的數據(暫時忘記套接字;表格不關心數據來自何處)。 (table)視圖顯示數據,(tableview)控制器連接這兩個視圖。

所以,你將有一組保存數據模型對象。他們不關心數據的顯示方式,也不關心數據來自哪裏(套接字)。他們只是持有這些數據。有時候這些都是由Singleton管理的,有時當創建視圖控制器時,指向模型的指針會交給每個視圖控制器。這兩種方法都很好。將模型交給視圖控制器會更靈活一些,但需要更多的代碼。

然後是另一個對象,你SocketClient,即獲取數據並更新模型。 SocketClient不保存數據。它只處理套接字並更新模型。它對視圖控制器一無所知,他們對此一無所知。

每當模式的轉變,所述視圖控制器被通知。這通常通過NSNotification進行處理,但也可以通過KVO或委託進行處理。

0

個人而言,我讓類處理插座一個單(稱之爲SocketHandler),則提供一個協議,規定爲從插座接收數據通知方法。也許:

@protocol SocketDelegate 
- (void)socketHandler:(SocketHandler *)handler didReceiveData:(NSData *)data; 
@end 

然後,你可以給你SocketHandler例如一組id<SocketDelegate>對象(視圖控制器),並且只需調用相關的委託方法,當處理器接收數據,通知每個視圖控制器。我不會將單例套接字處理程序看作「委託」,而是將信息傳遞給許多其他類的網絡連接適配器。