0

我在我的应用程序中使用了大量非常小的 Web 服务,并且我已经走了几条无法按预期扩展或工作的道路。

我正在考虑的设计方法:viewController 的任务是从一般 webServicesClass 中请求一组数据,这个任务在一个新的 NSThread 中启动 -> 这将实例化一个仅检索 xml 并将其返回给webServicesClass -> webServicesClass 现在实例化一个对象,该对象只能解析来自该特定 Web 服务的一些 XML。然后解析器返回一个不错的 Entity 对象给 webServiceClass。WebserviceClass 现在需要通知 viewController 这个数据。

viewController 实现了一个 webServiceClassDelegate 和一些委托方法,以查看 Web 服务请求是否按计划进行。例如 -(void)aWebserviceFailed 和 -(void)aWebserviceSuccess。

0.5由于运行的WebserviceClass是不同的NSThread,在父对象的主NSThread上调用委托方法会不会有问题?

1.0我认为这个设计是合理的,因为它完全封装了不同类中Entity的检索、解析和返回。但是,我将不得不为每个不同的 Web 服务编写委托方法并在每个步骤中实现委托协议。即从底层开始,WebserviceClass 必须为检索 XML 的对象(start、fail、success)、解析 XML 的对象(start、fail、success)和 WebserviceClass 都实现委托方法。将这些响应中的每一个委托给必须再次实现来自 WebserviceClass 的委托方法(开始、失败、成功)的 viewController。有没有更简单的方法来做到这一点?

我有一些设计模式经验,但不是来自像 Objective C 那样一致地使用委托的语言。在 AS3 或 Java 中,我会有一些事件可以通过对象冒泡并通知正在监听更改的人。在我读过的所有目标示例代码中,我只看到 NSNotifications(相当于 AS3 或 Java 的“事件”)使用了 0.1% 的时间。

我所描述的设计将给我一些可以完美地扩展到许多 Web 服务的东西,并让我完全控制潜在错误/异常发生的位置,但似乎需要大量代码才能获得这种松散耦合。

1.1或者我应该完全接受委托方法并开始工作:)

感谢您提供的任何指示或帮助。我不要求源代码或类似的东西,更多的是“在你刚刚描述的日常情况下,这被认为是 Objective C 中的最佳实践”:)

4

1 回答 1

1

我建议看一下ASIHttpRequest(可在此处获得)和NSOperation+ (此处NSOperationQueue的文档)。我认为你不应该一直运行一个长期存在的线程来与你的 Web 服务对话,除非你绝对需要一个持续的连接。

基本上 ASIHttpRequest 和 NSOperation 都封装了所有的网络和线程的东西。操作使 iPhone 上的多线程非常好。本质上,您创建了一个操作(通过工厂或其他易于使用的东西),将其放入队列中并对结果执行某些操作。

至于你对结果做什么(这也适用于你的原始场景和0.5 和 1.1)通常发生的是你的操作/线程然后调用一个didSucceedAtGettingWhateverordidFailWithError:(NSError*)方法。委派几乎是通过电话提出请求的实际方式。如果有多个委托,那么您可以像在 Java 中一样使用主题观察者。

至于1.0,最终没有。我们通常做的是我们有一个 OperationDelegate 和 OperationTypes。根据哪个 OperationType 成功或完成,我们有不同的逻辑。这不是最好的,有很多不同的方法可以做到这一点,但无论你做什么,你都必须为不同的事件有不同的逻辑。这是一种方法还是多种方法取决于您。

于 2009-12-07T14:44:47.890 回答