试试这个代码:
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
不像NSURLConnection,我们通常为每个请求创建一个连接,NSURLSession,我们创建一个会话,而不是多个任务。
让我们定义我们的会话:
NSURLSessionConfiguration* config = [NSURLSessionConfiguration backgroundSessionConfiguration:@“myUniqueAppID”];
_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
我们首先要做的是创建一个配置,让它在后台运行。配置需要特定于您的应用的唯一标识符。最好使用应用的捆绑标识符,例如 com.yourCompany.appName
一旦我们有了我们的配置,我们就可以实例化我们的会话,我们在其中传递对委托的引用以及我们希望它在哪个队列上运行。你最喜欢的会希望它成为 mainQueue。
就本主题而言,我们将只处理下载任务。因此,一旦您有了要下载的文件的 URL,您就可以通过会话创建一个 downloadTask:
NSURLSessionDownloadTask* task = [_session downloadTaskWithRequest:request];
[task resume];
现在NSURLSession 的工作方式是将您的文件直接下载到临时目录。因此,您无需担心存储它。
在下载时,它会通知您已下载了多少,这对于通知您的用户下载进度非常有用:
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
CGFloat percentDone = (double)totalBytesWritten/(double)totalBytesExpectedToWrite;
// Notify user.
}
下载文件后,将调用以下方法:
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
// Either move the data from the location to a permanent location, or do something with the data at that location.
}
该方法的最后一个参数是数据下载到的位置。从这里,您可以将文件移动到可以使用它的永久位置,或者您可以访问数据并对其进行处理。但是,这些数据不会留在那里,所以如果你真的需要它,请确保不要离开它。
值得注意的是,Tasks 就像 NSURLConnection 一样可以取消:
[_currentTask cancel];
关于使用 NSURLSession 下载文件的基础知识。
我希望你觉得这很有用!