iPhone:从插座

问题描述:

我有更新的数据访问量:iPhone:从插座

  1. 委托来处理套接字连接,读取和插座上写入数据。

  2. MyTableViewController与方法来填充表与从插座接收到的数据的图。

我的问题是:

什么将一个有效的设计方法是,以填补在插座数据到达了表? (考虑到将来我会有其他几个观点也使用来自插座的数据。)

我想我应该有一个单一的SocketClient类来处理所有的消息通过套接字交换,然后通知各相关UIViewController。但是,在这种情况下,当数据到达套接字时,控制器对象已经实例化。这导致我将控制器用作单例。它有效,但我不喜欢这个。另一种方法是将我的所有控制器作为处理套接字连接的委托。我也不喜欢这个。

你的方法是什么?

这里正确的做法被称为模型 - 视图 - 控制器,它是在Cocoa的核心架构。该模型保存您的数据(暂时忘记套接字;表格不关心数据来自何处)。 (table)视图显示数据,(tableview)控制器连接这两个视图。

所以,你将有一组保存数据模型对象。他们不关心数据的显示方式,也不关心数据来自哪里(套接字)。他们只是持有这些数据。有时候这些都是由Singleton管理的,有时当创建视图控制器时,指向模型的指针会交给每个视图控制器。这两种方法都很好。将模型交给视图控制器会更灵活一些,但需要更多的代码。

然后是另一个对象,你SocketClient,即获取数据并更新模型。 SocketClient不保存数据。它只处理套接字并更新模型。它对视图控制器一无所知,他们对此一无所知。

每当模式的转变,所述视图控制器被通知。这通常通过NSNotification进行处理,但也可以通过KVO或委托进行处理。

个人而言,我让类处理插座一个单(称之为SocketHandler),则提供一个协议,规定为从插座接收数据通知方法。也许:

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

然后,你可以给你SocketHandler例如一组id<SocketDelegate>对象(视图控制器),并且只需调用相关的委托方法,当处理器接收数据,通知每个视图控制器。我不会将单例套接字处理程序看作“委托”,而是将信息传递给许多其他类的网络连接适配器。