Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NSThreaded设计中的委托?(iPhone)_Iphone_Cocoa_Nsthread_Delegation - Fatal编程技术网

NSThreaded设计中的委托?(iPhone)

NSThreaded设计中的委托?(iPhone),iphone,cocoa,nsthread,delegation,Iphone,Cocoa,Nsthread,Delegation,我在我的应用程序中使用了大量非常小的web服务,我已经走过了几条无法按预期扩展或工作的道路 我考虑的设计方法是: viewController的任务是从通用WebServices类请求一组数据,此任务在新的NSThread中启动->这将实例化一个仅检索xml并将其返回给WebServiceClass的对象->WebServiceClass现在实例化一个仅能解析来自此特定web服务的xml的对象。然后,解析器将一个好的实体对象返回给webServiceClass。WebserviceClass现在

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

我考虑的设计方法是: viewController的任务是从通用WebServices类请求一组数据,此任务在新的NSThread中启动->这将实例化一个仅检索xml并将其返回给WebServiceClass的对象->WebServiceClass现在实例化一个仅能解析来自此特定web服务的xml的对象。然后,解析器将一个好的实体对象返回给webServiceClass。WebserviceClass现在需要将此数据通知viewController

viewController实现webServiceClassDelegate和一些委托方法,以查看web服务请求是否按计划进行。e、 g.-(无效)AWebService失败和-(无效)AWebService成功

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

1.0我认为这个设计是合理的,因为它将实体的检索、解析和返回完全集中在不同的类中。但是,我必须为每个不同的Web服务编写委派方法并在每一步上实现委派协议。i、 e.从底部开始,WebserviceClass必须为检索XML的对象(开始、失败、成功)和解析XML的对象(开始、失败、成功)实现委派方法WebserviceClass必须能够将这些响应中的每一个委托给viewController,而viewController又必须实现WebserviceClass中的委托方法(start、fail、success)。 有没有更简单的方法

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

我所描述的设计将使我能够完美地扩展许多web服务,并使我能够完全控制潜在错误/异常发生的位置,但要获得这种松耦合,似乎需要大量代码

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


谢谢你的指点和帮助。我不是要源代码之类的,更多的是“在你刚才描述的每天的情况下,这被认为是目标C中的最佳实践”:

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

基本上ASIHttpRequest和NSOperation都封装了所有的网络和线程内容。操作使得iPhone上的多线程非常好。本质上,您创建了一个操作(为了方便使用,通过工厂或其他方式),将其放入队列中并对结果进行处理

至于您如何处理结果(这也适用于您的原始场景和0.5和1.1),通常情况下,您的操作/线程将调用
didSucceedAtGettingWhatever
didFailWithError:(NSError*)
方法。委派几乎是通过电话提出请求的实际方式。如果有多个委托,那么您可以像在Java中一样使用subject observer


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

非常感谢Malaxer!写下像我这样的问题总是很健康的,当我写的时候,我得到了一些见解,我几乎没有点击“帖子”。现在我很高兴我做到了。在阅读ASIHTTPRequest文档时,我还想到了该库同时提供了同步和异步请求方法。使用委托的意义仅在处理异步代码时相关。如果我已经在一个单独的NSThread中完成了整个任务,那么就没有必要将所有子例程分割成线程。所以我的getData和ParseData应该直接返回我的值。如果出现问题,我不在乎它是否异步发生,我只需要通知“Upper”它出了问题。WebserviceClass将获得大量的逻辑,但在工厂式的设计中,它将只考虑所有可能的结果,并返回适合此场景的对象。我现在感觉好多了,谢谢:)