NSURLSession(三)

IOS 网络开发NSURLSession(三)DownloadTask 原创Blog,转载请注明出处 blog.youkuaiyun.com/hello_hwcDemo 效果 下载一个URL,然后显示的ImageView并且保存到相册 之前的相册 保存图片后的相册 一 DownloadTask和DataTask的区别简而言之,DownloadTask是把文件直接download到磁盘。 详细来说,有以下几点区别 DownloadTask支持Background 阅读详情

NSURLSession的Download Task用于完成下载任务,本文介绍如何创建断点续传的下载任务和后台下载任务。


我们直接从分析Demo入手:

故事板如下:



只有一个View Controller,用于创建各种下载任务,并将下载后的图片显示到视图上,下载过程中会更新下载进度。

头文件代码如下:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface ViewController : UIViewController <NSURLSessionDownloadDelegate>  
  4.   
  5. /* NSURLSessions */  
  6. @property (strong, nonatomic)           NSURLSession *currentSession;    // 当前会话  
  7. @property (strong, nonatomic, readonly) NSURLSession *backgroundSession; // 后台会话  
  8.   
  9. /* 下载任务 */  
  10. @property (strong, nonatomic) NSURLSessionDownloadTask *cancellableTask; // 可取消的下载任务  
  11. @property (strong, nonatomic) NSURLSessionDownloadTask *resumableTask;   // 可恢复的下载任务  
  12. @property (strong, nonatomic) NSURLSessionDownloadTask *backgroundTask;  // 后台的下载任务  
  13.   
  14. /* 用于可恢复的下载任务的数据 */  
  15. @property (strong, nonatomic) NSData *partialData;  
  16.   
  17. /* 显示已经下载的图片 */  
  18. @property (weak, nonatomic) IBOutlet UIImageView *downloadedImageView;  
  19.   
  20. /* 下载进度 */  
  21. @property (weak, nonatomic) IBOutlet UILabel *currentProgress_label;  
  22. @property (weak, nonatomic) IBOutlet UIProgressView *downloadingProgressView;  
  23.   
  24. /* 工具栏上的按钮 */  
  25. @property (weak, nonatomic) IBOutlet UIBarButtonItem *cancellableDownload_barButtonItem;  
  26. @property (weak, nonatomic) IBOutlet UIBarButtonItem *resumableDownload_barButtonItem;  
  27. @property (weak, nonatomic) IBOutlet UIBarButtonItem *backgroundDownload_barButtonItem;  
  28. @property (weak, nonatomic) IBOutlet UIBarButtonItem *cancelTask_barButtonItem;  
  29.   
  30. - (IBAction)cancellableDownload:(id)sender; // 创建可取消的下载任务  
  31. - (IBAction)resumableDownload:(id)sender;   // 创建可恢复的下载任务  
  32. - (IBAction)backgroundDownload:(id)sender;  // 创建后台下载任务  
  33. - (IBAction)cancelDownloadTask:(id)sender;  // 取消所有下载任务  
  34.   
  35. @end  


一、创建普通的下载任务

这种下载任务是可以取消的,代码如下:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. - (IBAction)cancellableDownload:(id)sender {  
  2.     if (!self.cancellableTask) {  
  3.         if (!self.currentSession) {  
  4.             [self createCurrentSession];  
  5.         }  
  6.           
  7.         NSString *imageURLStr = @"http://farm6.staticflickr.com/5505/9824098016_0e28a047c2_b_d.jpg";  
  8.         NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:imageURLStr]];  
  9.         self.cancellableTask = [self.currentSession downloadTaskWithRequest:request];  
  10.           
  11.         [self setDownloadButtonsWithEnabled:NO];  
  12.         self.downloadedImageView.image = nil;  
  13.           
  14.         [self.cancellableTask resume];  
  15.     }  
  16. }  

如果当前的session为空,首先需要创建一个session(该session使用默认配置模式,其delegate为自己):

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 创建当前的session */  
  2. - (void)createCurrentSession {  
  3.     NSURLSessionConfiguration *defaultConfig = [NSURLSessionConfiguration defaultSessionConfiguration];  
  4.     self.currentSession = [NSURLSession sessionWithConfiguration:defaultConfig delegate:self delegateQueue:nil];  
  5.     self.currentSession.sessionDescription = kCurrentSession;  
  6. }  

随后创建下载任务并启动。

这种任务是可取消的,即下次下载又从0.0%开始:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. if (self.cancellableTask) {  
  2.     [self.cancellableTask cancel];  
  3.     self.cancellableTask = nil;  
  4. }  


二、创建可恢复的下载任务

可恢复的下载任务支持断点续传,也就是如果暂停当前任务,在下次再执行任务时,将从之前的下载进度中继续进行。因此我们首先需要一个NSData对象来保存已经下载的数据:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 用于可恢复的下载任务的数据 */  
  2. @property (strong, nonatomic) NSData *partialData;  

执行下载任务时,如果是恢复下载,那么就使用 downloadTaskWithResumeData:方法根据partialData继续下载。代码如下:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. - (IBAction)resumableDownload:(id)sender {  
  2.     if (!self.resumableTask) {  
  3.         if (!self.currentSession) {  
  4.             [self createCurrentSession];  
  5.         }  
  6.           
  7.         if (self.partialData) { // 如果是之前被暂停的任务,就从已经保存的数据恢复下载  
  8.             self.resumableTask = [self.currentSession downloadTaskWithResumeData:self.partialData];  
  9.         }  
  10.         else { // 否则创建下载任务  
  11.             NSString *imageURLStr = @"http://farm3.staticflickr.com/2846/9823925914_78cd653ac9_b_d.jpg";  
  12.             NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:imageURLStr]];  
  13.             self.resumableTask = [self.currentSession downloadTaskWithRequest:request];  
  14.         }  
  15.           
  16.         [self setDownloadButtonsWithEnabled:NO];  
  17.         self.downloadedImageView.image = nil;  
  18.           
  19.         [self.resumableTask resume];  
  20.     }  
  21. }  

在取消下载任务时,要将partialData数据保存起来,而且不要调用cancel方法:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. else if (self.resumableTask) {  
  2.     [self.resumableTask cancelByProducingResumeData:^(NSData *resumeData) {  
  3.         // 如果是可恢复的下载任务,应该先将数据保存到partialData中,注意在这里不要调用cancel方法  
  4.         self.partialData = resumeData;  
  5.         self.resumableTask = nil;  
  6.     }];  
  7. }  

另外在恢复下载时, NSURLSessionDownloadDelegate中的以下方法将被调用:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 从fileOffset位移处恢复下载任务 */  
  2. - (void)URLSession:(NSURLSession *)session  
  3.       downloadTask:(NSURLSessionDownloadTask *)downloadTask  
  4.  didResumeAtOffset:(int64_t)fileOffset  
  5. expectedTotalBytes:(int64_t)expectedTotalBytes {  
  6.     NSLog(@"NSURLSessionDownloadDelegate: Resume download at %lld", fileOffset);  
  7. }  


三、创建后台下载任务

后台下载任务,顾名思义,当程序进入后台后,下载任务依然继续执行。

首先创建一个后台session单例,这里的Session配置使用后台配置模式,使用backgroundSessinConfiguration:方法配置时应该通过后面的参数为该后台进程指定一个标识符,在有多个后台下载任务时这个标识符就起作用了。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 创建一个后台session单例 */  
  2. - (NSURLSession *)backgroundSession {  
  3.     static NSURLSession *backgroundSess = nil;  
  4.     static dispatch_once_t onceToken;  
  5.     dispatch_once(&onceToken, ^{  
  6.         NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfiguration:kBackgroundSessionID];  
  7.         backgroundSess = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];  
  8.         backgroundSess.sessionDescription = kBackgroundSession;  
  9.     });  
  10.       
  11.     return backgroundSess;  
  12. }  

在创建后台下载任务时,应该使用后台session创建,然后resume。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. - (IBAction)backgroundDownload:(id)sender {  
  2.     NSString *imageURLStr = @"http://farm3.staticflickr.com/2831/9823890176_82b4165653_b_d.jpg";  
  3.     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:imageURLStr]];  
  4.     self.backgroundTask = [self.backgroundSession downloadTaskWithRequest:request];  
  5.       
  6.     [self setDownloadButtonsWithEnabled:NO];  
  7.     self.downloadedImageView.image = nil;  
  8.       
  9.     [self.backgroundTask resume];  
  10. }  

在程序进入后台后,如果下载任务完成,程序委托中的对应方法将被回调:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 后台下载任务完成后,程序被唤醒,该方法将被调用 */  
  2. - (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler {  
  3.     NSLog(@"Application Delegate: Background download task finished");  
  4.       
  5.     // 设置回调的完成代码块  
  6.     self.backgroundURLSessionCompletionHandler = completionHandler;  
  7. }  

然后调用NSURLSessionDownloadDelegate中的方法:

以下是

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL*)location中的方法,该方法只有下载成功才被调用:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. else if (session == self.backgroundSession) {  
  2.     self.backgroundTask = nil;  
  3.     AppDelegate *appDelegate = [AppDelegate sharedDelegate];  
  4.     if (appDelegate.backgroundURLSessionCompletionHandler) {  
  5.         // 执行回调代码块  
  6.         void (^handler)() = appDelegate.backgroundURLSessionCompletionHandler;  
  7.         appDelegate.backgroundURLSessionCompletionHandler = nil;  
  8.         handler();  
  9.     }  
  10. }  

另外无论下载成功与否,以下方法都会被调用:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 完成下载任务,无论下载成功还是失败都调用该方法 */  
  2. - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {  
  3.     NSLog(@"NSURLSessionDownloadDelegate: Complete task");  
  4.       
  5.     dispatch_async(dispatch_get_main_queue(), ^{  
  6.         [self setDownloadButtonsWithEnabled:YES];  
  7.     });  
  8.       
  9.     if (error) {  
  10.         NSLog(@"下载失败:%@", error);  
  11.         [self setDownloadProgress:0.0];  
  12.         self.downloadedImageView.image = nil;  
  13.     }  
  14. }  

取消后台下载任务时直接cancel即可:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. else if (self.backgroundTask) {  
  2.     [self.backgroundTask cancel];  
  3.     self.backgroundTask = nil;  
  4. }  


四、NSURLSessionDownloadDelegate

为了实现下载进度的显示,需要在委托中的以下方法中实现:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 执行下载任务时有数据写入 */  
  2. - (void)URLSession:(NSURLSession *)session  
  3.       downloadTask:(NSURLSessionDownloadTask *)downloadTask  
  4.       didWriteData:(int64_t)bytesWritten // 每次写入的data字节数  
  5.  totalBytesWritten:(int64_t)totalBytesWritten // 当前一共写入的data字节数  
  6. totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite // 期望收到的所有data字节数  
  7. {  
  8.     // 计算当前下载进度并更新视图  
  9.     double downloadProgress = totalBytesWritten / (double)totalBytesExpectedToWrite;  
  10.     [self setDownloadProgress:downloadProgress];  
  11. }  
  12.   
  13. /* 根据下载进度更新视图 */  
  14. - (void)setDownloadProgress:(double)progress {  
  15.     NSString *progressStr = [NSString stringWithFormat:@"%.1f", progress * 100];  
  16.     progressStr = [progressStr stringByAppendingString:@"%"];  
  17.       
  18.     dispatch_async(dispatch_get_main_queue(), ^{  
  19.         self.downloadingProgressView.progress = progress;  
  20.         self.currentProgress_label.text = progressStr;  
  21.     });  
  22. }  


从已经保存的数据中恢复下载任务的委托方法,fileOffset指定了恢复下载时的文件位移字节数:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* Sent when a download has been resumed. If a download failed with an 
  2.  * error, the -userInfo dictionary of the error will contain an 
  3.  * NSURLSessionDownloadTaskResumeData key, whose value is the resume 
  4.  * data.  
  5.  */  
  6. - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask  
  7.                                       didResumeAtOffset:(int64_t)fileOffset  
  8.                                      expectedTotalBytes:(int64_t)expectedTotalBytes;  


只有下载成功才调用的委托方法,在该方法中应该将下载成功后的文件移动到我们想要的目标路径:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* Sent when a download task that has completed a download.  The delegate should  
  2.  * copy or move the file at the given location to a new location as it will be  
  3.  * removed when the delegate message returns. URLSession:task:didCompleteWithError: will 
  4.  * still be called. 
  5.  */  
  6. - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask  
  7.                               didFinishDownloadingToURL:(NSURL *)location;  


无论下载成功或失败都会调用的方法,类似于try-catch-finally中的finally语句块的执行。如果下载成功,那么error参数的值为nil,否则下载失败,可以通过该参数查看出错信息:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* Sent as the last message related to a specific task.  Error may be 
  2.  * nil, which implies that no error occurred and this task is complete.  
  3.  */  
  4. - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task  
  5.                            didCompleteWithError:(NSError *)error;  



后台下载的运行结果:

启动任务后,进入后台:



下载完成后,控制台将会“通知”我们:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. 2014-02-05 18:30:39.767 DownloadTask[3472:70b] Application Delegate: App did become active  
  2. 2014-02-05 18:30:43.734 DownloadTask[3472:70b] Application Delegate: App will resign active  
  3. 2014-02-05 18:30:43.735 DownloadTask[3472:70b] Application Delegate: App did enter background  
  4. 2014-02-05 18:30:45.282 DownloadTask[3472:70b] Application Delegate: Background download task finished  
  5. 2014-02-05 18:30:45.285 DownloadTask[3472:4907] NSURLSessionDownloadDelegate: Finish downloading  
  6. 2014-02-05 18:30:45.301 DownloadTask[3472:4907] NSURLSessionDownloadDelegate: Complete task  

再次启动程序,可以看到加载好的页面:



可以看到,通过后台下载让我们的程序更加异步地运行。NSURLSession封装了对应的接口,让我们要执行的任务更加专门化,这个新的网络架构的功能真的很强大。


本文的Demo基于https://github.com/ShinobiControls/iOS7-day-by-day改写,内容基本一致。

原来的Demo也有一篇博客对应:iOS7 Day-by-Day :: Day 1 :: NSURLSession。


本文的Demo也已经上传,有兴趣的话可以下载看看。


iOS NSURLSessionDownloadTask设置代理文件下载的示例 通过设置代理我们可以拿到下载进度,对于大文件,我们还需要做到开始、暂停、继续以及取消等相应操作,这篇文章先简单的介绍一下通过代理来实现文件下载的问题: #import ViewController.h @interface ViewController ()<NSURLSessionDownloadDelegate> @end @implementation ViewController -(void)touchesBegan:(NSSet<UITouch> *)touches withEvent:(UIEvent *)event { [self delegate]; } -(v 立即下载

相关推荐

优化QT QML中RTSP流播放延迟:海康摄像头实时监控实践

本文详细探讨了在QT QML中优化海康摄像头RTSP流播放延迟的实践方法。通过调整MediaPlayer缓冲策略、硬件加速、解码器优选等五大技巧,显著降低实时监控场景下的延迟问题。文章还提供了海康摄像头RTSP连接实战代码和避坑指南,帮助开发者快速实现高效流媒体播放。

weixin_28363123的博客 556

NSURLSessionDownloadTask(大文件下载---block)

优缺点 优点:不需要担心内存(一边下载一边存入沙盒) 缺点:无法监听文件下载 具体使用 1.确定URL NSURL *url = [NSURL URLWithString:@""]; 2.创建请求对象 NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 3.创建会话对象 NSURLSession *session = [NSURLSession sharedSession]; 4.创建Task 第一个参数:请求对象

weixin_44729579的博客 438

Burp Suite手工验证CORS漏洞的四步闭环法

CORS(跨域资源共享)是Web应用实现跨域通信的基础机制,其安全本质在于服务端对Origin头的校验逻辑与响应头组合的语义一致性。当服务端错误地返回Access-Control-Allow-Origin: *并配合Access-Control-Allow-Credentials: true,或采用弱校验(如字符串包含匹配)时,将导致敏感数据泄露与凭据劫持风险。该漏洞难以被自动化扫描器发现,因其依赖请求上下文、认证状态及动态策略判断。Burp Suite作为核心工具,需通过构造跨域请求、捕获预检响应、交叉验

weixin_30596343的博客 512

NSURLSession学习笔记(三)Download Task

NSURLSession的Download Task用于完成下载任务,本文介绍如何创建断点续传的下载任务和后台下载任务。 我们直接从分析Demo入手: 故事板如下: 只有一个View Controller,用于创建各种下载任务,并将下载后的图片显示到视图上,下载过程中会更新下载进度。 头文件代码如下: [objc] 

majiakun1的专栏 2万+

usb gadget uvc driver的code分析

uvc的linux driver分为host侧和gadget侧两个driver。host侧的driver在v4l2框架下,而设备侧的driver在usb/gadget文件夹下。gadget侧的uvc driver,利用v4l2框架去注册video_device,向应用层提供调用接口。同时,它完成v4l2 video buffer拷贝到usb request下的buffer下,然后利用uvc实现的协

lintwins的专栏 1万+

从零开始:Ubuntu 24.04 LTS + Win11双系统安装教程

本文将简单直白介绍如何从零开始在同一台电脑上安装 Ubuntu 24.04 LTS 和 Windows 11,你可以在需要进行专业开发或运维工作时,轻松切换到 Ubuntu,享受其带来的高效与自由;而在日常学习生活和娱乐休闲时,依然可以无缝使用熟悉的 Windows 环境。

萑澈的博客 8112

NSURLSession中的downloadTask的使用

1.用downloadTask下载图片 优点:简单 缺点:不能监听下载的进度 代码示例: NSURL *url = [NSURL URLWithString:@"http://pic1.win4000.com/pic/b/03/21691230681.jpg"]; NSURLRequest *request = [NSURLRequest requestWithURL...

lyz0925的博客 1104

TenserRt平台SMOKE 3D目标检测部署完整教程:从理论到实践

本教程详细介绍了在RK3588平台上部署SMOKE 3D目标检测模型的完整流程。SMOKE是一种创新的单阶段单目3D检测方法,通过关键点估计直接预测3D目标信息,有效解决了深度信息缺失等挑战。文章从理论基础出发,解析了SMOKE的核心算法和网络架构,包括DLA-34主干网络和关键点中心化策略。同时提供了详细的Docker环境配置、模型导出到ONNX格式的实践指南,以及TensorRT引擎构建和性能优化的关键技术要点。该教程为开发者在嵌入式平台上实现高效3D目标检测提供了完整的技术参考。

LXY_LOVE36的博客 371

IOS开发之——下载-NSURLSession断点续传(07)

一 概述 NSURLConnection通过设置forHTTPHeaderField:@"Range"实现断点续传 本文介绍NSURLSession通过downloadTaskWithResumeData实现断点续传 二 NSURLSession实现断点续传的过程 界面上添加一个开始/暂停下载按钮,控制开始及暂停,点击按钮进行状态取反 开始下载包含了:从0开始下载和暂停后继续下载两种状态 从0开始下载时,NSURLSession通过downloadTaskWithURL执行下载操作,并回调NSURL

我的博客 941

华为od 面试八股文_C语言_02_含答案

华为od 面试八股文_C语言_02_含答案

MISAYAONE的博客 2230

【EB_Tresos专题】-01-EB Tresos导入工程

<--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--> <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--> 结尾 ...

「汽车电子助手」的博客 6433

NSURLSession-task三个子类

#pragma mark - NSURLSession ‘三种下载任务的基本演示’ // 1 ------------------------------------------------------------ NSURLSessionDataTask - (void)downloadWithDataTask:(NSString *)urlString { // 1.

CharlesYaoxin的博客 431

SAP Word 模板与 ABAP XML 数据流合并机制深度解析

Office Open XML 标准把一个.docx拆分成多个部件(document.xml、customXml\item1.xml 等),天然支持命名空间与 XPath;Word 在渲染时,会扫描<w:sdt>(结构化文档标签)与来确定绑定关系;在 ABAP 端,通过简单字符串替换与 XSLT 变换即可完成数据灌入,无需 COM Automation,安全且易于调试。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 371

NSURLSession笔记(三)Download Task

NSURLSession的Download Task用于完成下载任务,本文介绍如何创建断点续传的下载任务和后台下载任务。 我们直接从分析Demo入手: 故事板如下: 只有一个View Controller,用于创建各种下载任务,并将下载后的图片显示到视图上,下载过程中会更新下载进度。 头文件代码如下: [objc] 

沐阳的博客 431

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

NSURLSession(三)Download Task

NSURLSession的Download Task用于完成下载任务,本文介绍如何创建断点续传的下载任务和后台下载任务。 我们直接从分析Demo入手: 故事板如下: 只有一个View Controller,用于创建各种下载任务,并将下载后的图片显示到视图上,下载过程中会更新下载进度。 头文件代码如下: [objc]

wenzfcsdn的专栏 453

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

NSURLSession(三)POST请求—>上传图片

这个例子,还是以新浪微博为例。 首先在宏定义出POST请求头的一个属性:请求体边界,它是干什么用的呢,先别急,往下看 #define boundary @"AaB03x" //设置边界 参数可以随便设置     //1.构建URL       NSURL *url=[NSURL URLWithString:@"https://api.weibo.com/2/statuses/u

Default is Zero. 4332

玩转iOS开发:NSURLSession讲解(三)

文章分享至我的个人技术博客: https://cainluo.github.io/14986211698053.html 前言 虽然前面两讲都是说了NSURLSession的一些理论上的知识, 但我们现在起码对NSURLSession有个大概的了解, 并不会像一开始的那样, 一脸懵逼的看着, 这个请求是什么鬼, 那个方法是什么鬼, Task是什么东西, 如果没有去看的朋友们可以去看看前面两讲玩转...

weixin_34355715的博客 114
上一篇: NSURLSession(二)
下一篇: 使用CAShapeLayer实现复杂的View的遮罩效果
xiaoliu_iOS
博客等级 码龄11年 4粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值