AFNetworking i transfery w tle
Trochę się mylę, jak skorzystać z nowego systemu iOS 7NSURLSession
funkcje przesyłania w tle iAFNetworking (wersje 2 i 3).
widziałemWWDC 705 - What’s New in Foundation Networking
sesja i zademonstrowali pobieranie w tle, które trwa po zakończeniu aplikacji lub nawet zawiesza się.
Odbywa się to za pomocą nowego APIapplication:handleEventsForBackgroundURLSession:completionHandler:
oraz fakt, że delegat sesji w końcu otrzyma wywołania zwrotne i może wykonać swoje zadanie.
Zastanawiam się więc, jak używać go z AFNetworking (jeśli to możliwe), aby kontynuować pobieranie w tle.
Problem polega na tym, że AFNetworking w wygodny sposób używa API opartego na blokach do wykonywania wszystkich żądań, ale jeśli aplikacja zakończy się lub ulegnie awarii, ten blok również zniknie. Więc jak mogę wykonać zadanie?
A może coś mi tutaj brakuje ...
Pozwól mi wyjaśnić, co mam na myśli:
Na przykład moja aplikacja jest aplikacją do przesyłania zdjęć, powiedzmy, że mamPhotoMessage
obiekt reprezentujący jedną wiadomość, a ten obiekt ma właściwości takie jak
state
- opisz stan pobierania zdjęć.resourcePath
- ścieżka do ostatecznego pobranego pliku zdjęcia.Więc kiedy otrzymuję nową wiadomość z serwera, tworzę nowąPhotoMessage
obiekt i zacznij pobierać jego zasób fotograficzny.
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];
Jak widać, używam bloku uzupełniania, aby go zaktualizowaćPhotoMessage
obiekt zgodnie z odpowiedzią, jaką otrzymuję.
Jak mogę to osiągnąć dzięki transferowi w tle? Ten blok zakończenia nie zostanie wywołany, w wyniku czego nie mogę zaktualizowaćnewPhotoMsg
.