- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我正在创建一个 NSMutableRequest
:
self.req = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0];
超时设置为 10 秒,因为我不希望用户等待太久才能获得反馈。之后我创建了一个 NSURLSessionDataTask
:
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 调用都以相同的方式失败。阻止它的唯一方法是终止应用程序并重新开始。在超时错误后我应该做些什么来终止任务或连接?如果我不设置超时,我等到从服务器收到错误代码,所有以下调用都可以正常工作(但用户等待了很多!)。
我试图取消任务:
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];
}
最佳答案
我没有看到你恢复你开始的任务。您需要声明:
[task resume];
此行恢复任务(如果暂停)。
尝试调用 NSURLSession 如下:
[NSURLSession sharedSessison] instead of self.session
并通过以下方式使 session 无效:
[[NSURLSession sharedSession]invalidateAndCancel];
来自 Apple 的文档:
When your app no longer needs a session, invalidate it by calling either invalidateAndCancel (to cancel outstanding tasks) or finishTasksAndInvalidate (to allow outstanding tasks to finish before invalidating the object).
- (void)invalidateAndCancel
Once invalidated, references to the delegate and callback objects are broken. Session objects cannot be reused.
要允许未完成的任务运行直到完成,请改为调用 finishTasksAndInvalidate。
- (void)finishTasksAndInvalidate
This method returns immediately without waiting for tasks to finish. Once a session is invalidated, new tasks cannot be created in the session, but existing tasks continue until completion. After the last task finishes and the session makes the last delegate call, references to the delegate and callback objects are broken. Session objects cannot be reused.
要取消所有未完成的任务,请改为调用 invalidateAndCancel。
关于ios - NSURLSessionDataTask 超时后续请求失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31427934/
我有一个使用 NSURLSessionDataTask 调用 API 的函数,您可以在此处查看它: - (void)getExplorerUrl:(void (^)(NSString *))measu
我正在尝试向服务器发出请求,该请求应该返回我可以在应用程序的其余部分中使用的数据。这是我的代码: func makeNewUser() -> NSDictionary { var full_u
我正在使用 AFNetworking 并且我正在覆盖 -dataTaskWithRequest:completionHandler: 以基本上 MITM 我的请求并在调用实际响应 block 之前进行
我使用 NSURLSessionDataTask 获取 JSON 提要,并填充位于共享存储(单例)内的 NSMutableArray。外部世界可以通过将其转换为 NSArray 的 getter 来访
我不知道如何同步 NSURLSessionDataTask。 如何在 syncInfo1Info2 中同步这两个 session : - (void) syncInfo1Info2 { //How
我想知道 NSURLSessionDataTask 在后台的行为。 NSURLSessionDataTask 是否会立即暂停(一旦应用程序进入后台)?还是 iOS 会给出一些时间(希望有 30 秒左右
我正在创建一个 NSMutableRequest: self.req = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequ
当我开始使用 NSURLSessionDataTask 下载文件时,有一段时间进度不工作。然后在完成下载后只显示全蓝色的进度条。 我的代码 - (void)URLSession:(NSURLSess
我对 Objective C 和 iOS 开发总体来说是新手。我正在尝试创建一个应用程序,它会发出 http 请求并在标签上显示内容。 当我开始测试时,我注意到标签是空白的,尽管我的日志显示我已经恢复
我正在学习有关访问 API 和解析结果的教程。我正在逐字逐句地学习教程,但由于“预期返回‘NSURLSessionDataTask’的函数中缺少返回值”,我无法运行该程序 所以我将返回语句更改为“re
我要使用 NSURLSessionDataTask 执行请求链。当第一个请求完成时,我需要使用第一个请求中的 responseData 来执行另一个多重请求。最后,我得到 NSArray 并提供给 T
我正在尝试从将同时运行的多个 NSURLSessionDataTasks 中聚合数据。 __block NSMutableDictionary *languageDetails = [NSMutabl
我刚刚用 Swift 开发了一个库,用于将数据发布到特定服务器。我使用 NSURLSession.sharedSession().dataTaskWithRequest(request) 打开连接。现
我有一个 iOS 应用程序,它使用 NSOperationQueue、NSOperations 和 AFNetworking 2.1.0 来触发对服务器的请求。 -[NSOperation main]
我知道我可以使用 dataTaskWithURL:completionHandler: 获取 completionHandler block 中的数据,但这会阻止触发委托(delegate)方法,我需
场景: 作为用户,我可以拍摄(无限量)存储在应用程序文档文件夹中的照片和视频。这些媒体文件中的每一个都会在 Sqlite 数据库中获得一条记录,其中包含附加信息(例如标题)。所有这些都可以完全离线完成
在使用 NSURLSessionDataTask 向服务器发送 JSON 请求时,我遇到了一个非常奇怪的问题。 第一个请求通过并且我收到正确的 JSON 响应,当我执行第二个请求时,我总是得到旧的响应
我想确定来自 NSURLSessionDataTask 的响应是来自缓存,还是来自服务器 我正在从 创建我的 NSURLSessionDataTask request.cachePolicy = NS
我有一个注册 View Controller ,它处理所有用户输入并调用传递给它的另一个类 (wsClass) 中的函数,该数据作为 NSDictionary。 调用 wsClass 中的函数并建立连
我从 Web 获取 JSON 数据,对其进行解析,然后使用它在 map 上显示图钉。 这里是方法一,没有问题: NSString *CLIENT_ID = @"SECRET_ID"; NSSt
我是一名优秀的程序员,十分优秀!