3

如何使用 跟踪多个下载NSURLSession

例如:

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil];
NSURLSessionDownloadTask *jsonTask = [session downloadTaskWithURL:[NSURL URLWithString:[urlString stringByAppendingString:@"iOSMenu.json"]]];
NSURLSessionDownloadTask *imageTask = [session downloadTaskWithURL:[NSURL URLWithString:[urlString stringByAppendingString:@"menu1@2x.png"]]];
NSURLSessionDownloadTask *titleTask = [session downloadTaskWithURL:[NSURL URLWithString:[urlString stringByAppendingString:@"titleBar@2x.png"]]];

[jsonTask resume];
[imageTask resume];
[titleTask resume];

我下载了这三个文件,我可以用 来确认NSLog,就像这样。

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
    NSLog(@"%@", location);
}

但我不知道如何访问和区分这些文件。我怎样才能做到这一点?

4

1 回答 1

1

didFinishDownloadingToURL方法将向您传递NSURLSessionDownloadTask对该委托方法中的引用。由此,您可以参考任务的taskIdentifier或参考任务的originalRequest.URL属性。

您要确保将文件移动location到将来可以访问的位置(当您从 中返回时didFinishDownloadingToURL,如果您不使用它,它将删除该临时文件)。

例如,您可以将文件保存到您的文档文件夹中。在此示例中,我将获取原始 URL 的最后一个路径组件,在您的文档文件夹中创建一个文件路径,并将该文件移动到新位置:

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
    NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *path = [documentsPath stringByAppendingPathComponent:[downloadTask.originalRequest.URL lastPathComponent]];
    NSURL *newLocation = [NSURL fileURLWithPath:path];

    NSError *error;
    if (![[NSFileManager defaultManager] moveItemAtURL:location toURL:newLocation error:&error]) {
        NSLog(@"failed to move %@ to %@: %@", location, newLocation, error);
    }
}

或者,如果您不想依赖lastPathComponent原始 URL,您可以维护一个字典,将任务标识符(或原始 URL)映射到您要保存文件的新位置。您可以在创建任务时构建该字典,然后didFinishDownloadingToURL可以使用该字典中的任务标识符查找所需的目的地,并在moveItemAtURL方法中使用它。显然,如果这是一个后台会话,您需要确保将此交叉引用保存到持久存储,以便在下载完成后重新启动应用程序时重新检索它。

于 2014-08-22T14:59:53.243 回答