Я хочу загрузить список файлов с помощью NSUrlSession.iOS 7 NSURLSession Загрузите несколько файлов в фоновом режиме
У меня есть переменная для подсчета успешных загрузок @property (nonatomic) int downloadsSuccessfulCounter;
. Пока файлы загружаются, я отключу Download Button
. Когда счетчик равен размеру списка загрузки, я включаю кнопку еще раз и установить счетчик на 0. Я делаю это в методе:
-(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;
}
}];
}
Все работает отлично, но когда я снова открыть ViewController, я получаю сообщение A background URLSession with identifier com.myApp already exists!
. Счетчик не установлен в 0, и элементы пользовательского интерфейса (UIButtons, UILabels) не отвечают.
Я думаю, проблема в том, что NSURLSession все еще открыт, но я не уверен, как это работает.
Я пробовал все учебники, но 99% из них предназначены только для скачивания 1 файла, не более 1 ... Любые идеи?
Вот мой код:
...
@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];
}
Когда я нажимаю Download Button
я называю этот метод ( У меня есть Downloadable
объект, который содержит 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;
}
}
}
Когда приложение находится в Справочная информация:
-(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];
}];
}
}
}];
}
В настоящее время я изучаю это тоже ... проблема заключается в идентификаторе сеанса - они должны быть уникальными для каждой последующей задачи. В соответствии с этим текстом << Примечание: вы должны создать ровно один сеанс на идентификатор (указанный при создании объекта конфигурации). Поведение нескольких сеансов с одним и тем же идентификатором не определено. >> с этой страницы: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html –
Я думаю, есть два варианта, которые я могу увидеть: 1) скомпилировать все в zip-файл, загрузить этот один файл, затем разархивировать его на стороне клиента (телефона) - или 2) Создать NSMutableArray задач, который добавляет новый фоновый сеанс с уникальным идентификатором для каждого файла во время выполнения. –
В этом учебнике есть предпосылка для нескольких файлов: http://code.tutsplus.com/tutorials/working-with-nsurlsession-part-3--mobile-21879 –