Objective C(iPhone)中的POST请求链

时间:2013-05-13 23:13:49

标签: iphone ios objective-c http post

我需要向服务器发送一组带有一些数据的请求。后续请求中的数据将根据先前请求中的服务器响应来确定。我不想对NSURLConnection类使用同步方法,因为它非常有限(例如,对于其中一个请求,我需要防止重定向。根据Apple Dev文档,这只能通过Delegate实现来完成)。

根据链中的哪个请求,我需要做不同的事情(向不同的类发送不同的消息)。

我现在看到的方式是,我必须为每个请求创建n个委托,或者创建一个initWithFlag委托,然后用不同的标志创建该委托的实例,或者我需要使用类似工厂模式的东西,这与第二种工具模式非常相似。

我根本不想实现委托,我想发送尽可能少编码的请求。 我也没有看任何框架(ASIHTTPRequest等),我想用本机类做。

最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

我知道你说你不想使用第三方框架,但我真的建议AFNetworking。话虽如此,你不需要AFNetworking或任何第三方图书馆,它只会让你的生活更轻松恕我直言。

所以,我在类似场景中所做的主要是使用命令模式。当我想发送其中一个复杂的“请求”时,我初始化一个命令对象,设置所有必要的参数,然后调用execute。我的命令对象有完成和失败处理程序/块,execute是异步调用。

在命令中,我有不同的“步骤”,它们是有效同步的并且相互依赖。假设请求A依赖于B而B取决于C,该命令的第一步是在其自己的队列上执行A(我正在使用带有私有队列的GCD)并等待它完成。一旦A完成(成功),我继续到B并将我需要的任何结果从A传递到B.同样对于B-> C.如果任何中间请求在整个过程中失败,我可以执行failure块并从我执行命令的位置(消费者端)处理它。如果全部成功完成,我执行success块。

我更喜欢这种方法的封装,因为它很容易在整个项目中重复使用,所有复杂的东西都隐藏在命令的实现中。

哦,我使用回调/块的事实我不需要实现任何委托。在您使用NSURL类的情况下,您的命令对象将是任何这些实例的委托。

答案 1 :(得分:0)

毕竟我已经决定实施委托了。 绊倒我的关键事情是:

  1. 不要在.h文件中声明委托方法。他们不会那样工作。只需将它们添加到实施中即可。
  2. 委托可以在NSURLConnection initWithRequest方法中初始化,也可以作为父类的属性保存,没有区别。
  3. 处理多个请求的最佳方法是建议的initWithFlag。因此,最好在初始化连接时创建委托。代表的工作时间足以在ARC下执行完整的数据传输。
  4. 取消重定向的最便捷方式来自Apple的开发人员库:

      -(NSURLRequest *)connection:(NSURLConnection *)connection  
        willSendRequest:(NSURLRequest *)request  
       redirectResponse:(NSURLResponse *)redirectResponse  
    {  
    NSURLRequest *newRequest = request;  
    if (redirectResponse)   
    {  
        newRequest = nil;  
    }  
    return newRequest;  
    }
    

    请注意,由于未公开的原因,在连接有效期内会多次发送此消息。但是,如果回复不是实际重定向,则redirectResponse将为nil。 将请求设置为nil将取消重定向,但NSURLConnection将完成处理原始数据(即,将发送connectionDidFinishLoading消息)。 您可以通过发送此消息来取消此行为: [connection cancel];

  5. 我发现NSNotifications是将结果传递给父类的最佳方法。