如何使用NSURLSession跟踪多个下载?

时间:2014-08-22 12:12:30

标签: objective-c nsurlsession nsurlsessiondownloadtask

如何使用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);
}

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

1 个答案:

答案 0 :(得分: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);
    }
}

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