1

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

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

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

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

最好的方法是什么?

4

2 回答 2

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这是将结果传递给父类的最佳方式。

于 2013-05-18T11:59:21.013 回答
0

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

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

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

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

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

于 2013-05-13T23:35:55.583 回答