2013-02-25 48 views
1

我正在對通過TCP從服務器接收一組不同消息的客戶端進行編程。我創建了一個簡單的測試類,它能夠連接到服務器並以NSData塊的形式接收消息。但現在我被困在如何從這裏開始,需要一些設計建議。客戶端通過網絡接收消息的設計建議

一個想法我是創建一個協議,對於每個消息,通知委託與接收到的消息的類型和包含消息的對象:

協議

-(void)didReceiveLifesign:(LifesignMessage*)message; 
-(void)didReceiveLocation:(LocationMessage*)message; 
... 

分析器

-(void)didReceiveData:(NSData*)data { 
    int type = getType(data); 
    switch(type) { 
     case 0: [self.delegate didReceiveLifesign:parseLifesign(data); break; 
     case 1: [self.delegate didReceiveLocation:parseLocation(data); break; 
     ... 
    } 
} 

但隨着消息量的增長我覺得這個解決方案很混亂。有沒有更好的方法來做到這一點?

回答

1

每次向系統中添加新類型的消息時,都會添加新代碼來處理該特定類型。你無法擺脫這一點。所以,你現在可以真正抽象出來的地方就是調度:就你的情況而言,switch語句。

如果很少有新的消息類型將在未來添加,最簡單的方法可能是你已經採取的最簡單的方法:每次只需添加一個新的「案例」。

另一種方法是允許其他代碼註冊爲「偵聽器」/「回調」。這使調度通用。邏輯變成:

  • 查找消息類型
  • 發往所有註冊的回調/監聽器

新的「問題」是:你現在就需要在某些時候註冊的每個聽衆。在某種類型的初始化過程中,這將是sdone。如果您的消息調度程序基本上是整個應用程序的一部分,並且不在其他地方使用,它可能不值得。

相關問題