Я немного запутался в том, как воспользоваться преимуществами новых функций переноса 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
.