NSThreaded设计中的代表团? (苹果手机)

时间:2009-12-07 14:29:32

标签: iphone cocoa nsthread delegation

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

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

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

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

1.0 我认为这个设计很合理,因为它完全包含了Entity在不同类中的检索,解析和返回。但是,对于每个不同的Web服务,我将不得不在每个步骤中编写委派方法并实现委派协议。即从底层开始,WebserviceClass必须为检索XML的对象(启动,失败,成功)实现委托方法,然后为解析XML的对象(启动,失败,成功)实现委托方法,WebserviceClass必须能够将每个响应委托给viewController,再次必须从WebserviceClass实现委托方法(启动,失败,成功)。 有更简单的方法吗?

我有一些设计模式的经验,但不是那些使用委托如此一致地使用委托C的语言。在AS3或Java中,我会有事件可以通过对象冒出来并告知谁正在收听变化。在我读过的所有Objective示例代码中,我只看到了0.1%的时间使用的NSNotifications(相当于AS3或Java'Event')。

我描述的设计将为我提供一些可以很好地扩展到许多Web服务的东西,并让我完全控制潜在的错误/异常发生的位置,但似乎有很多代码可以获得这种松耦合。

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

感谢您给出的任何指示或帮助。我不是要求源代码或类似的东西,更多的是“在你刚才描述的每一天的情况下,这被认为是目标C中的最佳实践”:)

1 个答案:

答案 0 :(得分:1)

我建议您查看ASIHttpRequest(可获得的here)和NSOperation + NSOperationQueue(文档here)。我不认为你应该运行一个长期存在的线程来与你的web服务进行通信,除非你绝对需要一个持续的连接。

基本上ASIHttpRequest和NSOperation都封装了所有的网络和线程。操作使iPhone上的多线程非常好。基本上你创建一个操作(通过工厂或诸如易用的东西),将它弹出一个队列并对结果做一些事情。

至于你对结果做了什么(这也适用于你的原始场景以及 0.5和1.1 ),通常会发生什么操作/操作线程将调用didSucceedAtGettingWhatever或{ {1}}方法。代表团几乎是在电话上提出请求的事实方式。如果有多个委托,那么您可以像使用Java一样使用主题观察者。

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