使用NSURLSession同步获取数据(通过添加信号量)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用NSURLSession同步获取数据(通过添加信号量)相关的知识,希望对你有一定的参考价值。

参考技术A //创建NSURL对象

NSURL *url = [NSURL URLWithString:@""]]; 

//创建请求对象

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@""]];

__block NSData *responseData = nil;    

__block NSError *responseError = nil;

NSURLSession *session = [NSURLSession sharedSession];

dispatch_semaphore_t semaphore= dispatch_semaphore_create(0);

NSURLSessionDataTask *task = [session dataTaskWithRequest:request

completionHandler:

^(NSData *data, NSURLResponse *response, NSError *error)

// ...

responseData = data;

responseError = error;

NSLog(@"-----%@",response);

dispatch_semaphore_signal(semaphore);

];

[task resume];

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

使用 NSURLSession 如何在取消下载任务时获取接收到的数据或临时文件位置

【中文标题】使用 NSURLSession 如何在取消下载任务时获取接收到的数据或临时文件位置【英文标题】:with NSURLSession how to get received data or temp file location on cancelling downloadtask 【发布时间】:2014-12-04 05:25:49 【问题描述】:

我正在使用 NSURLSession 下载多个文件,即使在取消 下载任务 时我也想保存下载的数据,并且在恢复时想要开始下载剩余数据。 我的

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
    didReceiveData:(NSData *)data

没有被调用。

此我的代码下载:

sessionConfig =[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"Download Manager"];

sessionConfig.allowsCellularAccess=!_UseOnlyWiFi;

sessionConfig.HTTPMaximumConnectionsPerHost=1;

queue.maxConcurrentOperationCount=1;

session =[NSURLSession sessionWithConfiguration:sessionConfig
                                                         delegate:self
                                                    delegateQueue:[NSOperationQueue mainQueue]];


NSURLSessionDownloadTask *downloadTask=[session downloadTaskWithURL:dwurl ];

[downloadTask resume];

【问题讨论】:

你有没有分配代理NSURLSessionDelegate、NSURLSessionTaskDelegate、NSURLSessionDownloadDelegate 是的,正在调用其他委托方法 你已经写了datatask,你应该写下载任务委托 【参考方案1】:
`you have implemented datatask delegate but created download task implement this`

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
                                       didWriteData:(int64_t)bytesWritten
                                  totalBytesWritten:(int64_t)totalBytesWritten
                          totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;
instead of
(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data 

【讨论】:

我已经实现了这个方法及其工作,但是这个方法不返回下载的数据。我想将部分下载的数据保存到 .part 文件中 它是一个下载任务,为什么您要保存部分完成的文件。 从我暂停或取消任务的地方恢复下载任务 它会自动恢复下载,这就是为什么当你第一次调用 downloadtask resume 时它会开始下载,无论它是恢复还是开始第一次下载 但是如果我暂停下载任务并关闭我的网络连接并在网络连接后恢复它不会恢复。【参考方案2】:

也许你可以尝试使用

cancelByProducingResumeData:

上面写着Apple documentation:

Cancels a download and calls a callback with resume data for later use.

【讨论】:

以上是关于使用NSURLSession同步获取数据(通过添加信号量)的主要内容,如果未能解决你的问题,请参考以下文章

如何同步获取 GCDWebServerBodyReaderCompletionBlock?

延迟显示异步获取的项目

如何通过 AFNetworking 和 NSUrlSession 调用 SOAP Web 服务

NSURLSession 从 Servlet 获取响应

使用 NSURLSession 如何在取消下载任务时获取接收到的数据或临时文件位置

NSURLSession - 数据为零