使用 AFNetworking 2.0 处理后台任务

Posted

技术标签:

【中文标题】使用 AFNetworking 2.0 处理后台任务【英文标题】:Using AFNetworking 2.0 with background tasks 【发布时间】:2014-10-19 18:15:19 【问题描述】:

我在使用 AFURLSessionManager 实现后台任务时遇到问题。 我正在创建一个带有 BaseURL 和 SessionConfiguration 的新 AFHTTPSessionManager,使用 NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier: 并使用便捷的方法创建一个 POST 请求。

当我运行我的应用程序时,第一个请求正常发送,但第二个请求返回 A background URLSession with identifier ID already exists! 并导致应用程序崩溃。

我看过 Apple 的 WWDC 2013 视频,他们建议您只创建一次会话配置,使用

dispatch_once(&onceToken, ^
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.yourcompany.appId.BackgroundSession"];
    session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
);

但是,AFURLSessionManager 的 session 属性设置为只读,我无法传递自定义 NSURLSession,只有一个 NSURLSessionConfiguration,它是在 AFURLSessionManager:init 内部创建的:

self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];

我觉得我做错了什么,但我还能如何使用 AFNetworking 支持后台任务?

【问题讨论】:

【参考方案1】:

你不能实例化一个新的AFHTTPSessionManager然后改变它的session来引用一些单例NSURLSession是正确的。因此,您应该将 AFHTTPSessionManager 对象本身设置为可以在整个应用程序中重用的共享实例。

在end of this answer,我提供了一个使用 AFNetworking 进行后台会话的示例。

【讨论】:

我想你可以,但除非有迫切的需要,否则我不会打扰。对我来说感觉像是过早的优化...... 后期评论:我的应用程序使用共享的AFHTTPSessionManager 对象定期下载(用户提示),我想添加后台更新。我应该为此创建另一个AFHTTPSessionManager 吗?或者是否可以即时更改NSURLSessionConfiguration 是的,您需要单独的AFHTTPSessionManager(或AFURLSessionManager)。您不能即时更改configuration

以上是关于使用 AFNetworking 2.0 处理后台任务的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking 2.0 对请求进行分组或批量处理

如何使用 AFNetworking 2.0 处理 Parse.com Rest API 错误

AFNetworking 2.0 - 是不是使用子类?

AFNetworking 2.0 响应对象处理

使用 AFNetworking 2.0 异常解析 JSON

AFNetworking 2.0 + TLS 1.2