Chcę pobrać listę plików za pomocą NSUrlSession.iOS 7 NSURLSession Pobierz wiele plików w tle
Mam zmienną do liczenia udanych pobrań @property (nonatomic) int downloadsSuccessfulCounter;
. Podczas pobierania plików wyłączam Download Button
. Gdy licznik jest równy wielkości listy pobierania, ponownie włączyć przycisk i ustawić licznik do 0. I to zrobić w metodzie:
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
...
[[NSOperationQueue mainQueue] addOperationWithBlock:^ {
downloadsSuccessfulCounter++;
if(downloadsSuccessfulCounter == self.downloadList.count) {
NSLog(@"All downloads finished");
[self.syncButton setEnabled:YES];
downloadsSuccessfulCounter = 0;
}
}];
}
Wszystko działa poprawnie, ale kiedy otwórz ponownie ViewController Otrzymuję komunikat A background URLSession with identifier com.myApp already exists!
. Licznik nie jest ustawiony na 0, a elementy interfejsu użytkownika (UIButtons, UILabels) nie odpowiadają.
Zgaduję, że problem polega na tym, że NSURLSession jest wciąż otwarta, ale nie jestem pewien, jak to działa.
Próbowałem wszystkich tutoriali, ale 99% z nich służy tylko do pobierania 1 pliku, nie więcej niż 1 ... Jakieś pomysły?
Oto mój kod:
...
@property (nonatomic, strong) NSURLSession *session;
...
- (void)viewDidLoad {
[super viewDidLoad];
appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
self.downloadList = [[NSMutableArray alloc] init];
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.myApp"];
sessionConfiguration.HTTPMaximumConnectionsPerHost = 5;
self.session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil];
}
po naciśnięciu Download Button
nazywam tę metodę ( Mam Downloadable
obiekt, który zawiera NSURLSessionDownloadTask
):
-(void)startDownload {
for (int i=0; i<[self.downloadList count]; i++) {
Downloadable *d = [self.downloadList objectAtIndex:i];
if (!d.isDownloading) {
if (d.taskIdentifier == -1) {
d.downloadTask = [self.session downloadTaskWithURL:[NSURL URLWithString:d.downloadSource]];
}else {
d.downloadTask = [self.session downloadTaskWithResumeData:fdi.taskResumeData];
}
d.taskIdentifier = d.downloadTask.taskIdentifier;
[d.downloadTask resume];
d.isDownloading = YES;
}
}
}
Gdy aplikacja jest w Tło:
-(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session{
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
[self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
if ([downloadTasks count] == 0) {
if (appDelegate.backgroundTransferCompletionHandler != nil) {
void(^completionHandler)() = appDelegate.backgroundTransferCompletionHandler;
appDelegate.backgroundTransferCompletionHandler = nil;
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
completionHandler();
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
localNotification.alertBody = @"All files downloaded";
[[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
}];
}
}
}];
}
Obecnie badam to również ... problemem jest identyfikator sesji - muszą być unikalne dla każdego kolejnego zadania. Zgodnie z tym tekstem << Uwaga: Musisz utworzyć dokładnie jedną sesję na identyfikator (określoną podczas tworzenia obiektu konfiguracyjnego). Zachowanie wielu sesji współużytkujących ten sam identyfikator jest niezdefiniowane. >> z tej strony: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html –
Zgaduję, że są dwie opcje, które mogę zobaczyć: 1) skompiluj wszystko plik zip, pobierz ten pojedynczy plik, a następnie rozpakuj go po stronie klienta (telefon) - lub 2) Utwórz NSMutableArray zadań, które dodają nową sesję tła z unikalnym identyfikatorem dla każdego pliku w czasie wykonywania. –
Ten samouczek wydaje się mieć założenie wielu plików: http://code.tutsplus.com/tutorials/working-with-nsurlsession-part-3--mobile-21879 –