如何使用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);
}
但我不知道如何访问和区分这些文件。我怎么能这样做?
答案 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
方法中使用该字典。显然,如果这是后台会话,您需要确保将此交叉引用保存到持久存储,以便在下载完成时重新启动应用程序时重新检索它。