AFHTTPSessionManager 便捷方法(GET、POST、PUT 等)和后台传输

Posted

技术标签:

【中文标题】AFHTTPSessionManager 便捷方法(GET、POST、PUT 等)和后台传输【英文标题】:AFHTTPSessionManager convenience methods (GET, POST, PUT, etc) and background transfers 【发布时间】:2015-02-12 13:40:57 【问题描述】:

我已经围绕 AFNetworking 2.0 的 AFHTTPSessionManager 及其良好的 HTTP 便捷方法构建了一个应用程序。我现在需要确保所有这些网络功能都可以在后台运行,我很担心。

阅读 Apple 的文档,我可以看到后台会话不支持数据任务。简单看了一下 AFHTTPSessionManager 对 GET、POST、PUT 等的实现,似乎全面使用了 NSURLSessionDataTask。

是我遗漏了什么,还是我需要重新设计和返工?

如果我是对的(我怀疑我是对的),并且此代码路径不允许我进行后台上传和下载,是否有任何理由我无法包装 AFURLSessionManager 的其他使用非数据任务是否以与当前 HTTP 方法包装“dataTaskWithRequest:completionHandler”相同的方式?例如对于 POST,我也许可以使用“uploadTaskWithRequest:fromData:progress:completionHandler”?

我在问,因为我想知道这是否是一条可行的路线,为什么 AFNetworking 开发人员不使用它,以便 AFHTTPSessionManager 的便捷方法允许后台传输。

【问题讨论】:

【参考方案1】:

AFNetworking 允许您执行后台请求(但请注意不要使用任何特定于任务的完成块,并确保您实现了适当的应用委托方法;请参阅AFNetworking 2.0 and background transfers)。您可能也可以使用AFHTTPRequestSerializerrequestWithMethod 来简化构建请求的过程(尽管,IIRC,您不能将请求的HTTPBody 用于后台上传请求,因此您可能必须保存对文件的请求,然后使用该文件发出您的后台上传请求)。

但是您绝对正确,您在使用后台会话时不能使用AFHTTPSessionManager 方法来启动NSURLSessionDataTask 任务。关于他们为什么以这种方式实现它,这是一个更适合 their issues forum 的问题。

【讨论】:

要么,要么您必须在请求和您要在完成委托方法中执行的操作类型之间维护一些交叉引用(并确保它在持久存储中维护)。或者您可以根据任务的originalRequest.URL 推断出正确的操作。有很多方法可以解决这个问题...... 不,你的直觉是绝对正确的。我一定在其他帖子中不清楚。 积木无法生存。这就是为什么您不能依赖任何特定于任务的积木,因为它们都已丢失。所以,我所做的是在应用程序下次运行时重新实例化会话级别的块,从而将我限制在一些仅根据任务执行的简单处理程序(例如,获取 URL 并从中做出决定)。但你是对的,所有旧的块和变量和东西都早已不复存在。 会话完成后,您的应用程序将被唤醒并调用handleEventsForBackgroundURLSession,在其中我们重新实例化后台会话并保存completionHandler。现在NSURLSession 将调用会话的任务完成委托方法(如果您有多个后台任务已完成,则快速连续地调用),这意味着将为每个后台任务调用我们刚刚重新创建的downloadTaskDidFinishDownloadingBlock。最后调用URLSessionDidFinishEventsForBackgroundURLSession,调用我们定义的调用保存的completionHandler的块。 "或者handleEventsForBackgroundURLSession 是一个电话,告诉您设置会话以允许您处理一些迫在眉睫的特定任务回调?"所以,是的,这正是发生的事情:我们调用单例来保存completionHandler 的过程更重要的是实例化会话,这反过来又允许自动调用后台任务完成方法。 是的。请记住,有两种类型的错误。 setTaskDidCompleteBlock 处理了基本的连接问题。但不会以这种方式报告“404 - 未找到”之类的错误。您还必须检查setDownloadTaskDidFinishDownloadingBlock 中的statusCode(例如检查[downloadTask.response isKindOfClass:[NSHTTPURLResponse class]],如果是,请查看[(NSHTTPURLResponse *)downloadTask.response statusCode] 是否等于200。

以上是关于AFHTTPSessionManager 便捷方法(GET、POST、PUT 等)和后台传输的主要内容,如果未能解决你的问题,请参考以下文章

iOS 如何处理传递给 AFHTTPSessionManager GET 方法的空格或特殊字符?

AFNetworking 2.0 AFHTTPSessionManager

更改 AFHTTPSessionManager 的基本 URL

如何在使用 AFHTTPSessionManager 发送 POST 请求时向参数发送空白数据

iOS网络——AFNetworking AFHttpSessionManager源码解析

iOS网络——AFNetworking AFHttpSessionManager源码解析