Eri*_*gas 2 iphone cocoa-touch objective-c ios
我需要连接的后端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);
}];
Run Code Online (Sandbox Code Playgroud)
即使后端API仍在处理请求,也不会返回任何数据并且所有响应头字段都为空.
我听说我可能需要设置一个名为"socketTimout"的区间,以便套接字知道保持连接打开的时间更长,但我不知道在哪里设置它.
而不是尝试延长超时,最好稍微修改一下服务器架构.让服务器在获得所有数据后立即返回200 OK,然后在后台队列中完成处理.创建另一个可用于检索数据的API调用,并让iOS应用程序定期检查数据是否已处理.或者,使用推送通知让用户/手机知道数据何时完成处理.
如果您碰巧使用Ruby on Rails,那么在工作线程上设置长时间运行的进程非常容易.看看delayed_job Ruby gem.
如果由于某种原因您无法修改服务器的运行方式,请尝试确保您使用的API本身没有超时集.我想不出iOS会忽略你设置的timeoutInterval的原因,除非该属性是只读的.请尝试使用此init方法:
- initWithURL:cachePolicy:timeoutInterval:
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
879 次 |
| 最近记录: |