0

当我关闭 WiFi 连接并在 iPhone 6s 10.2 模拟器上运行以下代码时,回调永远不会执行。我预计回调会很快触发,并出现“无 Internet 连接”之类的错误。

NSLog(@"request-start");
NSURLRequest* request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://www.google.com"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:0];
task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    NSLog(@"request-end");
}];
[task resume];

我的问题

当应用程序首次加载时,我正在获取数据。如果wifi被关闭,我需要显示一个错误。如果我设置了超时,它会被遵守 - 但它需要超过 10 秒,我不想让他们等待。我也尝试通过可达性检测网络状态,但网络状态通常是unknown在应用程序首次加载时。

4

1 回答 1

2

timeoutIntervalForResource

此属性根据此配置确定会话中所有任务的资源超时间隔。资源超时间隔控制在放弃之前等待整个资源传输的时间(以秒为单位)。资源计时器在请求启动时启动并计数,直到请求完成或达到此超时间隔,以先到者为准。

默认值为 7 天。

timeoutIntervalForRequest

重要的

如果原始请求因超时而失败,后台会话创建的任何上传或下载任务都会自动重试。要配置允许重试或传输上传或下载任务多长时间,请使用 timeoutIntervalForResource 属性。

默认值为 60。

因此,如果没有设置超时,您的连接将运行 7 天。

一般来说,如果线路出现问题,NSURLSession 后台会话不会使任务失败。相反,它会继续寻找运行请求的好时机并在那时重试。这种情况一直持续到资源超时到期(即用于创建会话的 NSURLSessionConfiguration 对象中的 timeoutIntervalForResource 属性中的值)。该值的当前默认值为一周!

资源

于 2017-02-20T20:05:21.697 回答