0

我使用 AFNetworking 作为我的应用程序的连接库。由于后端限制,我无法在应用启动时同时发送两个请求,因为服务器会识别出 CookieTheftException (Grails)。在第一次成功连接后,我可以同时请求尽可能多的请求,但第一个请求必须是串行的。我怎样才能做到这一点?

我想使用信号量,但我不能阻止主线程。

编辑 1

我试图覆盖,但没有奏效。我认为操作队列不会等待一个请求完成(包括它的回调)来启动另一个请求。

- (void)enqueueHTTPRequestOperation:(AFHTTPRequestOperation *)operation
{
    [self.operationQueue setMaxConcurrentOperationCount:1];
    [super enqueueHTTPRequestOperation:operation];
}

编辑 2

我意识到 maxConcurrentOperation 有效,实际上一次执行 1 个操作。问题是已经在没有服务器需要的 cookie 的情况下创建了排队的请求。

4

3 回答 3

4

我对 Grails 或您系统的特定架构一无所知,但也许这可以通过简单地关闭该请求的 cookie 来解决,使用NSMutableURLRequest -setHTTPShouldHandleCookies:.

除此之外,确保该初始调用只运行一个请求操作的最佳方法是完全忽略队列,并AFHTTPRequestOperation在您的子类上简单地拥有一个属性AFHTTPClient。您甚至可以使用 KVO 来确保在初始请求完成之前暂停操作队列。

于 2013-01-18T17:02:31.043 回答
2

我建议阅读有关GCD的内容

您可以创建一个队列并在此队列中放置一些要执行的块。

这边走:

  • 它不会阻塞主线程
  • 由于您的所有网络块都将在一个队列中执行,因此不可能同时执行两个块。
于 2013-01-17T20:33:00.103 回答
0

您可以将队列的最大并发操作数设置为 1。这样一次只会发出一个请求。

[self.httpClient.operationQueue setMaxConcurrentOperationCount:1];

但是既然你只需要等待第一个请求,为什么不自己调用那个请求,然后在第一个请求完成时才初始化其他请求呢?

于 2013-01-17T20:34:38.883 回答