【问题标题】:AFNetworking - Serialize ConnectionAFNetworking - 序列化连接
【发布时间】:2014-05-02 02:15:12
【问题描述】:

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

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

编辑 1

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

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

编辑 2

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

【问题讨论】:

    标签: ios grails afnetworking


    【解决方案1】:

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

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

    【讨论】:

    • 您好,马特,谢谢您的帮助。使用 KVO 检查第一个请求何时完成,并且“dispatch_resume”队列就像一个魅力!
    【解决方案2】:

    我建议阅读GCD

    您可以创建一个队列并将一些要执行的块放入该队列中。

    这边:

    • 不会阻塞主线程
    • 由于您的所有网络块都将在一个队列中执行,因此不可能同时执行两个块。

    【讨论】:

      【解决方案3】:

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

      [self.httpClient.operationQueue setMaxConcurrentOperationCount:1];
      

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

      【讨论】:

      • 我不想在第一个请求发生时锁定用户。顺便说一句,他可以离线使用应用程序,并且随时可以打开互联网,第一个请求需要序列化。
      • 我相信即使最大并发操作数为 1,您仍然可以在后台(异步)调用您的请求。值得一试。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      相关资源
      最近更新 更多