【发布时间】:2014-02-16 11:27:25
【问题描述】:
我对如何利用新的 iOS 7 NSURLSession 后台传输功能和 AFNetworking(版本 2 和 3)有点困惑。
我看到了WWDC 705 - What’s New in Foundation Networking 会话,他们演示了在应用程序终止甚至崩溃后继续进行后台下载。
这是使用新的 API application:handleEventsForBackgroundURLSession:completionHandler: 完成的,并且会话的委托最终将获得回调并可以完成其任务。
所以我想知道如何将它与 AFNetworking(如果可能)一起使用以继续在后台下载。
问题是,AFNetworking 方便地使用基于块的 API 来执行所有请求,但如果应用程序终止或崩溃,这些块也会消失。那么如何才能完成任务呢?
或者我在这里遗漏了一些东西......
让我解释一下我的意思:
例如,我的应用程序是一个照片消息应用程序,假设我有一个代表一条消息的 PhotoMessage 对象,并且该对象具有类似的属性
-
state- 描述照片下载的状态。 -
resourcePath- 最终下载的照片文件的路径。
所以当我从服务器收到一条新消息时,我会创建一个新的PhotoMessage 对象,并开始下载它的照片资源。
PhotoMessage *newPhotoMsg = [[PhotoMessage alloc] initWithInfoFromServer:info];
newPhotoMsg.state = kStateDownloading;
self.photoDownloadTask = [[BGSessionManager sharedManager] downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
NSURL *filePath = // some file url
return filePath;
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
if (!error) {
// update the PhotoMessage Object
newPhotoMsg.state = kStateDownloadFinished;
newPhotoMsg.resourcePath = filePath;
}
}];
[self.photoDownloadTask resume];
如您所见,我使用完成块根据收到的响应更新 PhotoMessage 对象。
如何通过后台传输来实现这一点?不会调用此完成块,因此我无法更新 newPhotoMsg。
【问题讨论】:
标签: ios objective-c afnetworking afnetworking-2