如何从NSURLSessionDownloadTask downloadTaskWithRequest获得响应

wag*_*nto 4 objective-c amazon-web-services ios nsurlsession nsurlsessiondownloadtask

首先是一些背景:应用程序应该从AWS S3服务器获取文件.为了做到这一点,该过程的第一步是转到本地服务器并从中获取文件的名称和一些其他信息.在该步骤之后,我们有一个完整的URLMutableRequest.

注意:我将NSURLSession设置为后台会话:

- (NSURLSession *)backgroundSession
{
    static NSURLSession *session = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"identifier"];
        session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
    });
    return session;
}
Run Code Online (Sandbox Code Playgroud)

这是从AWS S3服务器下载文件的任务:

对于此任务,我想使用委托以后台模式运行.

@property (nonatomic, strong) NSURLSessionDownloadTask *downloadTask;
@property (nonatomic, strong) NSURLSession *defaultSession; 

self.defaultSession = [self backgroundSession];
self.downloadTask = [self.defaultSession downloadTaskWithRequest:request];
[self.downloadTask resume];
Run Code Online (Sandbox Code Playgroud)

如何获得此请求的响应?

Apple文档说你在使用时不能将块作为completionHandler backgroundSessionConfiguration.

Rom*_* B. 6

如果有人想知道如何在下载完成之前获得下载响应,请尝试以下操作:取消dataTask,获取响应,然后根据需要将dataTask转换为下载.

NSURLSessionTask *task = [session dataTaskWithRequest:request];
[task resume];
Run Code Online (Sandbox Code Playgroud)

NSURLSessionDataDelegate

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler {
    // use response, convert data task to download task
    completionHandler(NSURLSessionResponseBecomeDownload);
}

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask {
    // downloadTask converted from dataTask
}
Run Code Online (Sandbox Code Playgroud)

NSURLSessionDownloadDelegate

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
    // update progress
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
    // copy downloaded file from location
}
Run Code Online (Sandbox Code Playgroud)


Mea*_*aur 1

NSURLSessionDownloadTask有一个应设置为响应的response属性(其基类的一部分)。NSURLSessionTask这里