iOS 7 NSURLSession Mehrere Dateien im Hintergrund herunterladen

Ich möchte eine Dateiliste mit NSUrlSession herunterladen.

Ich habe eine Variable zum Zählen der erfolgreichen Downloads@property (nonatomic) int downloadsSuccessfulCounter;. Während die Dateien heruntergeladen werden, deaktiviere ich dasDownload Button. Wenn der Zähler der Größe der Download-Liste entspricht, aktiviere ich die Schaltfläche erneut und setze den Zähler auf 0. Ich mache das in der Methode:

-(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;
        }
    }];

}

Alles funktioniert einwandfrei, aber wenn ich den ViewController wieder öffne, erhalte ich die MeldungA background URLSession with identifier com.myApp already exists!. Der Zähler ist nicht auf 0 gesetzt und die UI-Elemente (UIButtons, UILabels) reagieren nicht.

Ich denke, das Problem ist, dass die NSURLSession noch offen ist, aber ich bin mir nicht sicher, wie es funktioniert.

Ich habe alle Tutorials ausprobiert, aber 99% von ihnen dienen nur zum Herunterladen von 1 Datei, nicht mehr als 1 ... Irgendwelche Ideen?

Hier ist mein Code:

...    
@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];
}

Wenn ich auf das @ drücDownload ButtonIch rufe diese Methode auf (ich habe einDownloadable Objekt, das ein @ enthä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;
        }
    }
}

Wenn sich die App im Hintergrund befindet:

-(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];

                }];
            }
        }
    }];
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage