首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSURLSessionDataTask超时后续请求失败

NSURLSessionDataTask超时后续请求失败
EN

Stack Overflow用户
提问于 2015-07-15 10:30:30
回答 4查看 3.1K关注 0票数 11

我正在创建一个NSMutableRequest

代码语言:javascript
复制
self.req = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0];

超时设置为10秒,因为我不希望用户等待太久才得到反馈。之后,我创建了一个NSURLSessionDataTask

代码语言:javascript
复制
NSURLSessionDataTask *task = [self.session dataTaskWithRequest:self.req completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    NSHTTPURLResponse * httpResp = (NSHTTPURLResponse *)response;
    if (error) {
        // this is where I get the timeout
    } 
    else if (httpResp.statusCode < 200 || httpResp.statusCode >= 300) {
        // handling error and giving feedback
    } 
    else {
        NSError *serializationError = nil;
        NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&serializationError];
    }
    [task resume];
}

问题是服务器进入网关超时,这需要很长时间。我得到超时错误,并向用户提供反馈,但由于超时错误,以下所有API调用都以同样的方式失败。唯一的方法是停止它是杀死应用程序,并重新开始。在超时错误之后,我是否应该做些什么来关闭任务或连接?如果我不设置超时,直到从服务器接收到错误代码,下面的所有调用都可以很好地工作(但是用户等待了很多!)。

我试图取消这项任务:

代码语言:javascript
复制
NSURLSessionDataTask *task = [self.session dataTaskWithRequest:self.req completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    NSHTTPURLResponse * httpResp = (NSHTTPURLResponse *)response;
    if (error) {
        // this is where I get the timeout
        [task cancel];
    } 
    ...
    [task resume];
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-15 13:05:59

我没看到你继续你开始的任务。你必须声明:

代码语言:javascript
复制
[task resume];

如果任务被挂起,此行将继续执行任务。

尝试按以下方式调用NSURLSession:

代码语言:javascript
复制
[NSURLSession sharedSessison] instead of self.session

并通过下列方式使会议无效:

代码语言:javascript
复制
 [[NSURLSession sharedSession]invalidateAndCancel];

来自苹果公司的文件:

当您的应用程序不再需要会话时,通过调用invalidateAndCancel (取消未完成的任务)或finishTasksAndInvalidate (允许未完成的任务在使对象无效之前完成)使其失效。

代码语言:javascript
复制
    - (void)invalidateAndCancel

一旦失效,对委托和回调对象的引用就会中断。无法重用会话对象。

若要允许未完成的任务一直运行到完成,请调用finishTasksAndInvalidate。

代码语言:javascript
复制
  - (void)finishTasksAndInvalidate

此方法立即返回,而无需等待任务完成。会话无效后,无法在会话中创建新任务,但现有任务将一直持续到完成。在完成最后一项任务并进行最后一次委托调用之后,对委托和回调对象的引用就会中断。无法重用会话对象。

若要取消所有未完成的任务,请改用invalidateAndCancel。

票数 5
EN

Stack Overflow用户

发布于 2015-07-24 10:42:42

您最可能遇到的问题是,您的任务没有取消或完成,因此使会话无法接受更多的任务。根据苹果公司的文件

创建任务后,可以通过调用它的简历方法来启动它。然后,会话保持对任务的强烈引用,直到请求完成或失败为止;

正如T_77所建议的,尝试使用NSURLSession sharedSession

在这个时候,我还会尝试做的另一件事是试图找出在会话对象和任务之间是否存在一个保留循环,使用仪器

另一件可能发生的事情是,请求没有正确地形成,没有执行或挂起。有一次,当我试图将URL加载到web视图时,我遇到了一个类似的问题。页面没有加载,也没有抛出错误。也试一次验证url请求。

谢谢你,Suraj

票数 1
EN

Stack Overflow用户

发布于 2015-07-17 15:01:15

超时最有可能的原因是DNS解析为不存在的IP地址,或者服务器已经崩溃,需要重新启动。在任何情况下,如果一个请求随着超时而失败,更多的请求也有可能因超时而失败。

显然,您需要以这样一种方式编写您的应用程序:当它的服务器不应答时,它可以生存下来。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31427934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档