我应该使用singleton - Http Connection到服务器 - Iphone App设计

时间:2010-12-12 19:09:00

标签: iphone web-services cocoa-touch design-patterns singleton

所以我一直在阅读关于使用Singleton的利弊,我有一个场景,我不确定是否应该使用它,我想咨询你们。

我正在写一个Iphone应用程序,它偶尔必须与服务器(HTTP)有关登录用户的信息进行通信。 这个Web服务是从我的应用程序的不同部分调用的。

我真正需要的是两种类型:

  1. 负责与服务器的通信 - 负责http设置,网址,标题,参数等。
  2. 2.每种类型的Web服务api的类 - 用于exmpale UpdateUserInfo类或SendResults类。这个c

    第二课将使用第一课,而在整个应用程序中,我需要很多课程才能进入第二课。

    我应该在任何论文中使用Singleton吗?设计它的最佳方法是什么?

    谢谢你们!

    修改

    第一类(让我们称之为DataDownloader)方法的示例是:

    (NSData *) downloadDataWithRequest:(NSURLRequest *)
    {
        ASIHTTPRequest *dlRequest = [[ASIHTTPRequest alloc] initWithURL:[request URL]];
        [dlRequest setTimeOutSeconds:20];    
    
        if(retryNum < 1)
            retryNum = 1;
        [dlRequest setNumberOfTimesToRetryOnTimeout:retryNum];
    
           // and more of the same
    }
    

    ASIHTTPRequest是我们用作HTTP包装器的东西。

    现在我不想每次想要向服务器发送HTTP请求时调用此函数序列,因此选项是将其放入专用类并创建新实例或使用单一操作。

    我能做的就是使用类似的东西:

    [[UpdateUserInfo sharedInstance] updateInfo:info]
    

    可以通过使用参数信息设置NSURLRequest并调用

    来实现
    [[DataDownloader sharedInstance] downloadDataWithRequest:InfoUrlRequest]
    

    现在,假设http请求是异步的,我仍然可以同时产生多个。

    我希望现在更清楚了。 您认为设计它的最佳方式是什么?

5 个答案:

答案 0 :(得分:1)

我不认为单例模式是您尝试解决的问题的有用解决方案。它实际上是作为一种控制对单个/有限资源的访问的技术而设计的,从我所知道的情况来看,这并非有意义。

例如,您是否有任何理由不允许用户同时执行两项与网络相关的活动?

顺便说一下,你有兴趣看一下像NSURLConnection这样的Cocoa类吗?我不确定你是否需要一个较低级别的课程来管理你正在设想的服务器通信 - 这个类可能就足够了。 (不得不在不知道你想要实现的目标的情况下告诉。)

答案 1 :(得分:0)

也不要忘记ASIHTTPRequest。这是一个功能齐全的网络库

http://allseeing-i.com/ASIHTTPRequest/

答案 2 :(得分:0)

我通常(并且这是个人偏好)有一个控制网络管理的单例(一个单独和一个外观模式),而不是超过5个允许的连接。对你来说也是可能的。对于你的部分任务,这将是一个单身人士 但正如BobC已经指出的那样,ASIHTTPRequest应该做你需要的一切 不要重新发明轮子!

答案 3 :(得分:0)

我使用单例模式来控制对使用ASIHTTPRequest的基于Web的API的访问,并且它运行良好。 ASI使用NSOperationQueues进行异步请求,因此您无需担心请求互相攻击。

因为我不知道返回请求的顺序,所以我有时允许我的公共API方法提供userInfo字典,因此我的回调在它们触发时会有一些上下文。

答案 4 :(得分:0)

我会使用服务定位器模式来获取应用程序中所需的每个服务。创建服务定位器有几种不同的方法。我更喜欢在运行时在初始化时配置配置。

http://en.wikipedia.org/wiki/Service_locator_pattern