0

アプリへの接続ライブラリとしてAFNetworkingを使用しています。バックエンドの制限により、サーバーがCookieTheftException(Grails)を識別するため、アプリの起動時に2つのリクエストを同時に送信することはできません。最初の接続が成功した後、必要な数の同時リクエストを実行できますが、最初のリクエストはシリアルである必要があります。どうすればそれを達成できますか?

セマフォを使用することを考えましたが、メインスレッドをブロックできません。

編集1

オーバーライドしようとしましたが、機能しませんでした。操作キューは、一方の要求(コールバックを含む)が終了してもう一方の要求を開始するのを待たないと思います。

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

編集2

maxConcurrentOperationが機能し、実際には一度に1つの操作が実行されることに気付きました。問題は、エンキューされたリクエストが、サーバーが必要とするCookieなしですでに作成されていることです。

4

3 に答える 3

4

Grailsやシステムの特定のアーキテクチャについては何も知りませんが、おそらくこれは、その要求でCookieをオフにするだけで解決できる可能性がありますNSMutableURLRequest -setHTTPShouldHandleCookies:

それ以外に、その最初の呼び出しに対して1つの要求操作のみが実行されるようにするための最良の方法は、キューを完全に無視し、サブクラスAFHTTPRequestOperationにプロパティを設定することです。AFHTTPClientKVOを使いこなして、最初の要求が完了するまで操作キューを確実に一時停止することもできます。

于 2013-01-18T17:02:31.043 に答える
2

GCDについて読むことをお勧めします

キューを作成し、実行するブロックをこのキューに入れることができます。

こちらです:

  • メインスレッドをブロックしません
  • すべてのネットワークブロックが1つのキューで実行されるため、2つのブロックが同時に実行される方法はありません。
于 2013-01-17T20:33:00.103 に答える
0

キューの最大同時操作を1に設定できます。これにより、一度に1つの要求のみが実行されます。

[self.httpClient.operationQueue setMaxConcurrentOperationCount:1];

しかし、最初のリクエストを待つだけでよいので、そのリクエストを自分で呼び出して、最初のリクエストが完了したときにのみ他のリクエストを初期化してみませんか?

于 2013-01-17T20:34:38.883 に答える