2

接続する必要があるバックエンド API が応答を返すのに約 3 ~ 4 分かかります。iOS クライアントは正確に 60 秒 (デフォルト) でタイムアウトするようで、そのタイムアウトを延長する方法がわかりません。

NSURLRequest の timeoutInterval を大きな数値に設定し、Connection: Keep-Alive ヘッダーを設定しようとしましたが、うまくいきません。これが私が使用しているコードで、いくつかの API の詳細を省略しています。

NSURL *url = [NSURL URLWithString:@"myAPI"];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

[request setHTTPMethod:@"POST"];

NSString *postString = @"key1=val1&key2=val2...";
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];

request.timeoutInterval = 600.0f;

[request setValue:@"Keep-Alive" forHTTPHeaderField:@"Connection"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
     NSLog(@"data = %@", data);
}];

バックエンド API がまだリクエストを処理しているにもかかわらず、データが返されず、すべてのレスポンス ヘッダー フィールドが空です。

「socketTimout」間隔と呼ばれるものを設定する必要があるかもしれないと聞いたので、ソケットは接続をより長く開いたままにしておく必要がありますが、それを設定する場所がわかりません。

4

3 に答える 3

6

タイムアウトを延長しようとするよりも、サーバー アーキテクチャを少し変更することをお勧めします。サーバーがすべてのデータを取得したらすぐに 200 OK をキックバックさせ、バックグラウンド キューで処理を完了させます。データを取得するために使用できる別の API 呼び出しを作成し、データが処理されたかどうかを定期的に iOS アプリに確認させます。または、プッシュ通知を使用して、データの処理が完了したことをユーザー/電話に知らせます。

Ruby on Rails を使用している場合、長時間実行されるプロセスをワーカー スレッドで実行するように設定するのは非常に簡単です。delay_job Ruby gem を見てください。

何らかの理由でサーバーの動作を変更できない場合は、使用している API 自体にタイムアウトが設定されていないことを確認してください。そのプロパティが読み取り専用でない限り、設定している timeoutInterval をiOSが無視する理由は考えられません。代わりに、次の init メソッドを使用してみてください。

- initWithURL:cachePolicy:timeoutInterval:
于 2013-05-09T20:47:51.323 に答える
1

の代わりに NSURLConnection デリゲート メソッドを使用してみましたsendAsynchronousRequestか?

以下を使用して:

NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
[connection start];

デリゲート メソッドdidReceiveDataを監視し、受信データを NSMutableData のインスタンスに追加できます。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.data appendData:data];
}

そうすれば、少なくともデータを受信して​​いることを知ることができ、ユーザーにプログレス バーなどを表示することさえできます。

于 2013-05-09T20:31:54.560 に答える
0

エリック、この投稿の答えを確認してください。

NSURL接続タイムアウト?

基本的に、このメソッドを使用しますNSURLRequest

requestWithURL:cachePolicy:timeoutInterval:

于 2013-05-09T20:45:54.163 に答える