真?巨乳帝国cms首页不能更新最新地址afn!*真?巨乳帝国cms首页不能更新本月更新~~~~~afn

iOS- 利用AFNetworking3.0+(最新AFN) - 实现文件断点下载_小组_ThinkSAAS
iOS- 利用AFNetworking3.0+(最新AFN) - 实现文件断点下载
iOS- 利用AFNetworking3.0+(最新AFN) - 实现文件断点下载
官方建议AFN的使用方法
0.导入框架准备工作  
o1. 将AFNetworking3.0+框架程序拖拽进项目
o2. 或使用Cocopod 导入AFNetworking3.0+
#import "AFNetworking.h"
----&
1.UI准备工作  
A. 定义一个全局的 NSURLSessionDownloadTask:下载管理句柄
由其负责所有的网络操作请求
@interface ViewController ()
// 下载句柄
NSURLSessionDownloadTask *_downloadT
.h文件
#import &UIKit/UIKit.h&
@interface ViewController : UIViewController
// 下载文件显示
@property (weak, nonatomic) IBOutlet UIImageView *imageV
// 下载进度条显示
@property (weak, nonatomic) IBOutlet UIProgressView *progressV
.m文件
@interface ViewController ()
// 下载句柄
NSURLSessionDownloadTask *_downloadT
2.利用AFN实现文件下载操作细节  
- (void)downFileFromServer{
//远程地址
NSURL *URL = [NSURL URLWithString:@"/img/bdlogo.png"];
//默认配置
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
//AFN3.0+基于封住URLSession的句柄
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
//请求
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
//下载Task操作
_downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
// @property int64_t totalUnitC
需要下载文件的总大小
// @property int64_t completedUnitC 当前已经下载的大小
// 给Progress添加监听 KVO
NSLog(@"%f",1.0 * pletedUnitCount / downloadProgress.totalUnitCount);
// 回到主队列刷新UI
dispatch_async(dispatch_get_main_queue(), ^{
// 设置进度条的百分比
self.progressView.progress = 1.0 * pletedUnitCount / downloadProgress.totalUnitC
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
//- block的返回值, 要求返回一个URL, 返回的这个URL就是文件的位置的路径
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
return [NSURL fileURLWithPath:path];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
//设置下载完成操作
// filePath就是你下载文件的位置,你可以解压,也可以直接拿来使用
NSString *imgFilePath = [filePath path];// 将NSURL转成NSString
UIImage *img = [UIImage imageWithContentsOfFile:imgFilePath];
self.imageView.image =
3.关于暂停和继续  
- (IBAction)stopDownloadBtnClick:(id)sender {
//暂停下载
[_downloadTask suspend];
- (IBAction)startDownloadBtnClick:(id)sender {
//开始下载
[_downloadTask resume];
4.检测网络状态--优化用户体验  
- (void)viewDidLoad {
[super viewDidLoad];
//网络监控句柄
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
//要监控网络连接状态,必须要先调用单例的startMonitoring方法
[manager startMonitoring];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
//status:
//AFNetworkReachabilityStatusUnknown
//AFNetworkReachabilityStatusNotReachable
未连接
//AFNetworkReachabilityStatusReachableViaWWAN = 1,
//AFNetworkReachabilityStatusReachableViaWiFi = 2,
无线连接
NSLog(@"%d", status);
//准备从远程下载文件. -& 请点击下面开始按钮启动下载任务
[self downFileFromServer];
&& My GitHub:源码 
· AFNetworking3.0以下的版本使用方法可以看我老版本的日志:
作者: 清澈Saup
出处:
本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接。
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
官方1群:【已满】
让ThinkSAAS更好,把建议拿来。
关注微信,更好学习官方建议AFN的使用方法
0.导入框架准备工作  
&1. 将AFNetworking3.0+框架程序拖拽进项目
&2. 或使用Cocopod 导入AFNetworking3.0+
#import "AFNetworking.h"
1.UI准备工作  
A. 定义一个全局的 NSURLSessionDownloadTask:下载管理句柄
& &由其负责所有的网络操作请求
@interface ViewController ()
// 下载句柄
NSURLSessionDownloadTask *_downloadT
#import &UIKit/UIKit.h&
@interface ViewController : UIViewController
// 下载文件显示
@property (weak, nonatomic) IBOutlet UIImageView *imageV
// 下载进度条显示
@property (weak, nonatomic) IBOutlet UIProgressView *progressV
@interface ViewController ()
// 下载句柄
NSURLSessionDownloadTask *_downloadT
2.利用AFN实现文件下载操作细节  
- (void)downFileFromServer{
//远程地址
NSURL *URL = [NSURL URLWithString:@"/img/bdlogo.png"];
//默认配置
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
//AFN3.0+基于封住URLSession的句柄
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
//下载Task操作
_downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
// @property int64_t totalUnitC
需要下载文件的总大小
// @property int64_t completedUnitC 当前已经下载的大小
// 给Progress添加监听 KVO
NSLog(@"%f",1.0 * pletedUnitCount / downloadProgress.totalUnitCount);
// 回到主队列刷新UI
dispatch_async(dispatch_get_main_queue(), ^{
// 设置进度条的百分比
self.progressView.progress = 1.0 * pletedUnitCount / downloadProgress.totalUnitC
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
//- block的返回值, 要求返回一个URL, 返回的这个URL就是文件的位置的路径
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
return [NSURL fileURLWithPath:path];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
//设置下载完成操作
// filePath就是你下载文件的位置,你可以解压,也可以直接拿来使用
NSString *imgFilePath = [filePath path];// 将NSURL转成NSString
UIImage *img = [UIImage imageWithContentsOfFile:imgFilePath];
self.imageView.image =
&3.关于暂停和继续  
- (IBAction)stopDownloadBtnClick:(id)sender {
//暂停下载
[_downloadTask suspend];
- (IBAction)startDownloadBtnClick:(id)sender {
//开始下载
[_downloadTask resume];
&4.检测网络状态--优化用户体验  
- (void)viewDidLoad {
[super viewDidLoad];
//网络监控句柄
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
//要监控网络连接状态,必须要先调用单例的startMonitoring方法
[manager startMonitoring];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
//AFNetworkReachabilityStatusUnknown
//AFNetworkReachabilityStatusNotReachable
//AFNetworkReachabilityStatusReachableViaWWAN = 1,
//AFNetworkReachabilityStatusReachableViaWiFi = 2,
NSLog(@"%d", status);
//准备从远程下载文件. -& 请点击下面开始按钮启动下载任务
[self downFileFromServer];
&& My GitHub:源码&
& AFNetworking3.0以下的版本使用方法可以看我老版本的日志:
作者:&清澈Saup
本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接。
阅读(...) 评论()iOS--AFN实现原理
AFN的六大模块1,NSURLConnection主要对NSURLConnection进行了进一步的封装,包含以下核心的类:AFURLConnectionOperationAFHTTPRequestOperationManagerAFHTTPRequestOperation2,NSURLsession主要对象NSURLSession对象进行了进一步的封装,包含以下核心的类:AFURLSessionManagerAFHTTPSessionManager3,Reachability提供了与网络状态相关的操作接口,包含以下核心的类:AFNetworkReachabilityManager4,Security提供了与安全性相关的操作接口,包含以下核心的类:AFSecurityPolicy5,Serialization提供了与解析数据相关的操作接口,包含以下核心的类:AFURLRequestSerializationAFURLResponseSerialization6,UIKit提供了大量网络请求过程中与UI界面显示相关的操作接口,通常用于网络请求过程中提示,使用户交互更加友好,包含以下核心的分类/类:AFNetworkActivityIndicatorManagerUIActivityIndicatorView+AFNetworkingUIAlertView+AFNetworkingUIButton+AFNetworkingUIImageView+AFNetworkingUIKit+AFNetworkingUiprogressView+AFNetworkingUIRefreshControl+AFNetworkingUIWebView+AFNetworkingAFURLSessionManager创建任务的方法普通任务- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLResponse *response, id responSEObject, NSError *error))completionHandler/**&* request:请求对象&* completionHandler:请求完成调用的Block * response:服务器的响应信息 * responseObject:服务器返回的数据 * error:错误信息&*/上传任务(分别上传不同类型的文件)// 1. 上传文件类型的数据/**&* fileURL:所要上传文件的路径&*/- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL progress:(NSProgress * __autoreleasing *)progress completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler// 2. 上传NSData类型的数据- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData progress:(NSProgress * __autoreleasing *)progress completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler/**&* bodyData:所要上传的文件数据&*/// 3. 上传流数据- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request progress:(NSProgress * __autoreleasing *)progress completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler/**&* request:通过流数据初始化的请求对象&*/下载任务// 1. 普通下载任务- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request progress:(NSProgress * __autoreleasing *)progress destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler/**&* progress:管理下载进度&* destination:保存数据调用的Block * targetPath:数据的保存路径&*/// 2. 支持断点下载的下载任务- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData progress:(NSProgress * __autoreleasing *)progress destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler/**&* progress:管理下载进度&* resumeData:断点下载时的断点信息&*/AFHTTPSessionManager常用的属性baseURL(NSURL *),用于监视网络可达性与创建请求对象requestSerializer(AFHTTPRequestSerializer *),指定指定GET、HEAD与DELETE请求参数的解析格式responseSerializer(AFHTTPResponseSerializer *),用于指定服务器返回数据的格式常用方法初始化// 1. 通过工厂方法创建AFHTTPSessionManager对象+ (instancetype)manager// 2. 通过构造方法创建AFHTTPSessionManager对象- (instancetype)initWithBaseURL:(NSURL *)url/**&* 根据url初始化AFHTTPSessionManager对象&*/- (instancetype)initWithBaseURL:(NSURL *)url sessionConfiguration:(NSURLSessionConfiguration *)configuration/**&* 根据url与configuration初始化AFHTTPSessionManager对象&*/请求数据// 1. GET请求- (NSURLSessionDataTask *)GET:(NSString *)URLString parameters:(id)parameters success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure/**&* URLString:请求路径&* parameters:请求参数&* success:请求成功时调用的Block * responseObject:服务器返回的数据&* failure:请求失败时调用的Block * error:错误信息&*/// 2. POST请求- (NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure/**&* 参数含义与GET请求相同&*/- (NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters constructingBodyWithBlock:(void (^)(id &AFMultipartFormData& formData))block success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure/**&* block:用于创建多个数据来源&*/使用AFN请求网络数据请求数据(xml/JSON)创建AFHTTPSessionManager对象AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];指定对服务器的返回数据格式//以XML文档的形式返回数据manager.responseSerializer = [AFXMLParserResponseSerializer serializer];//以JSON形式返回数据manager.responseSerializer = [AFJSONResponseSerializer serializer];设置请求体(类型为XML或JSON)// 请求体通常由服务器指定格式NSDictionary *params = @{&& & & & & & & & & & & & @&username& : @&账号&,&& & & & & & & & & & & & @&pwd& : @&密码&,&& & & & & & & & & & & & @&type& : @&XML/JSON&&& & & & & & & & & & & & };发送请求[manager GET:@&请求路径& parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {& & //responseObject:服务器返回的数据& & NSLog(@&请求成功&);} failure:^(NSURLSessionDataTask *task, NSError *error) {& & //error:错误信息& & NSLog(@&请求失败&);}];上传数据创建AFHTTPSessionManager对象AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];创建上传任务/**基于NSURLConnection*/[manager POST:@&请求路径& parameters:@{@&用户名& : @&密码& constructingBodyWithBlock:^(id&AFMultipartFormData& formData) {& & //设置需要上传的文件& & NSData *data = [NSData dataWithContentsOfFile:@&所要长传文件的路径&];& & [formData appendPartWithFileData:data name:@&file& fileName:@&test.png& mimeType:@&image/png&];} success:^(NSURLSessionDataTask *task, id responseObject) {& & //上传成功} failure:^(NSURLSessionDataTask *task, NSError *error) {& & //上传失败}];& & & & & & & & & & & & & & & & & &/**基于NSURLSession*/[manager uploadTaskWithRequest:request fromData:data progress:progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {& & //上传数据成功}];下载数据& & & & & & & & & & & & & & & & & &创建AFHTTPSessionManager对象& & & & & & & & & & & & & & & & & && & AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];创建下载任务& & & & & & & & & & & & & & & & & &/**基于NSURLSession*/& & [manager downloadTaskWithRequest:request progress:progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {& & // 存储下载数据是调用的Block} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {& & //下载完成时调用的Block}];
最新教程周点击榜
微信扫一扫iOS-利用AFNetworking(AFN)-实现文件断点下载_iOS开发_
iOS-利用AFNetworking(AFN)-实现文件断点下载
来源:人气:4075
官方建议AFN的使用方法
&1. 定义一个全局的AFHttpClient:包含有
& & 1& baseURL
& & 2& 请求
& & 3& 操作队列 NStionQueue
&2. 由AFHTTequestOperation负责所有的网络操作请求
0.导入框架准备工作                                
&1. 将框架程序拖拽进项目
&2.& 添加iOS框架引用
&SystemConfiguration.framework
&MobileCoreServices.framework
#import "AFNetworking.h"
//下面用于下载完后解压
#import "SSZArchive.h"
&4. 修改xxx-Prefix.pch文件
#import &MobileCoreServices/MobileCoreServices.h&
#import &SystemConfiguration/SystemConfiguration.h&
1.AFN的客户端,使用基本地址初始化,同时会实例化一个操作队列,以便于后续的多线程处理
1 #import "ViewController.h"
2 #import "AFNetworking.h"
3 #import "SSZipArchive.h"
5 @interface ViewController ()
// AFN的客户端,使用基本地址初始化,同时会实例化一个操作队列,以便于后续的多线程处理
AFHTTPClient
// 下载操作
AFHTTPRequestOperation *_downloadO
NSOperationQueue *_
15 //下载进度条显示
16 @property (weak, nonatomic) IBOutlet UIProgressView *progressV
20 @implementation ViewController
关于文件下载,在Documents中保存的文件,一定是要应用程序产生的文件或者数据
没有明显提示用户下载到本地的文件不能保存在Docuemnts中!
28 - (void)viewDidLoad
[super viewDidLoad];
NSURL *url = [NSURL URLWithString:@"http://192.168.3.251/~apple/itcast"];
_httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
_queue = [[NSOperationQueue alloc] init];
2.利用AFN实现文件下载操作细节        
1 #pragma mark 下载
2 - (IBAction)download
// 1. 建立请求
NSURLRequest *request = [_httpClient requestWithMethod:@"GET" path:@"download/Objective-C2.0.zip" parameters:nil];
// 2. 操作
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
_downloadOperation =
// 指定文件保存路径,将文件保存在沙盒中
NSArray *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [docs[0] stringByAppendingPathComponent:@"download.zip"];
op.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
// 设置下载进程块代码
当前一次读取的字节数(100k)
totalBytesRead
已经下载的字节数(4.9M)
totalBytesExpectedToRead
文件总大小(5M)
[op setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
// 设置进度条的百分比
CGFloat precent = (CGFloat)totalBytesRead / totalBytesExpectedToR
NSLog(@"%f", precent);
_progressView.progress =
// 设置下载完成操作
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responbject) {
// 下载完成之后,解压缩文件
参数1:要解结压缩的文件名及路径 path - & download.zip
参数2:要解压缩到的位置,目录
- & document目录
[SSZipArchive unzipFileAtPath:path toDestination:docs[0]];
// 解压缩之后,将原始的压缩包删除
// NSFileManager专门用于文件管理操作,可以删除,复制,移动文件等操作
// 也可以检查文件是否存在
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];
// 下一步可以进行进一步处理,或者发送通知给用户。
NSLog(@"下载成功");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"下载失败");
// 启动下载
[_httpClient.operationQueue addOperation:op];
3.关于暂停和继续                 
1 - (IBAction)pauseResume:(id)sender
// 关于暂停和继续,AFN中的数据不是线程安全的
// 如果使用操作的暂停和继续,会使得数据发生混乱
// 不建议使用此功能。
// 有关暂停和后台下载的功能,NSURL中会介绍。
if (_downloadOperation.isPaused) {
[_downloadOperation resume];
[_downloadOperation pause];
4.检测网络状态--优化用户体验          
1 #pragma mark 检测网路状态
AFNetworkReachabilityStatusUnknown
AFNetworkReachabilityStatusNotReachable
AFNetworkReachabilityStatusReachableViaWWAN = 1,
AFNetworkReachabilityStatusReachableViaWiFi = 2,
8 - (IBAction)checkNetwork:(id)sender
// 1. AFNetwork 是根据是否能够连接到baseUrl来判断网络连接状态的
// 提示:最好使用门户网站来判断网络连接状态。
NSURL *url = [NSURL URLWithString:@""];
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:url];
_httpClient =
[_httpClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
// 之所以区分无线和3G主要是为了替用户省钱,省流量
// 如果应用程序占流量很大,一定要提示用户,或者提供专门的设置,仅在无线网络时使用!
switch (status) {
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"无线网络");
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"3G网络");
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"未连接");
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知错误");
&                                                      
作者:&清澈Saup
本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接。
                            
优质网站模板AFN框架基本使用 - 简书
下载简书移动应用
写了23497字,被34人关注,获得了35个喜欢
AFN框架基本使用
1.AFN框架基本使用
1.1 AFN内部结构
- NSURLConnection
+ AFURLConnectionOperation
+ AFHTTPRequestOperation
+ AFHTTPRequestOperationManager(封装了常用的 HTTP 方法)
* baseURL :AFN建议开发者针对 AFHTTPRequestOperationManager 自定义个一个单例子类,设置 baseURL, 所有的网络访问,都只使用相对路径即可
* requestSerializer :请求数据格式/默认是二进制的 HTTP
* responseSerializer :响应的数据格式/默认是 JSON 格式
* operationQueue
* reachabilityManager :网络连接管理器
* manager :方便创建管理器的类方法
* HTTPRequestOperationWithRequest :在访问服务器时,如果要告诉服务器一些附加信息,都需要在 Request 中设置
- NSURLSession
+ AFURLSessionManager
+ AFHTTPSessionManager(封装了常用的 HTTP 方法)
* UIKit + AFNetworking 分类
* NSProgress :利用KVO
- 半自动的序列化&反序列化的功能
+ AFURLRequestSerialization :请求的数据格式/默认是二进制的
+ AFURLResponseSerialization :响应的数据格式/默认是JSON格式
- 附加功能
+ 安全策略
* AFSecurityPolicy
+ 网络检测
* 对苹果的网络连接检测做了一个封装
* AFNetworkReachabilityManager
可以学习下AFN对 UIKit 做了一些分类, 对自己能力提升是非常有帮助的
1.2 AFN的基本使用
(1)发送GET请求的两种方式(POST同)
-(void)get1
//1.创建AFHTTPRequestOperationManager管理者
//AFHTTPRequestOperationManager内部是基于NSURLConnection实现的
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//2.发送请求
http://120.25.226.186:32812/login?username=ee&pwd=ee&type=JSON
第一个参数:NSString类型的请求路径,AFN内部会自动将该路径包装为一个url并创建请求对象
第二个参数:请求参数,以字典的方式传递,AFN内部会判断当前是POST请求还是GET请求,以选择直接拼接还是转换为NSData放到请求体中传递
第三个参数:请求成功之后回调Block
第四个参数:请求失败回调Block
NSDictionary *param = @{
@"username":@"520it",
@"pwd":@"520it"
//注意:字符串中不能包含空格
[manager GET:@"http://120.25.226.186:32812/login" parameters:param success:^(AFHTTPRequestOperation * _Nonnull operation, id
_Nonnull responseObject) {
NSLog(@"请求成功---%@",responseObject);
} failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) {
NSLog(@"失败---%@",error);
-(void)get2
//1.创建AFHTTPSessionManager管理者
//AFHTTPSessionManager内部是基于NSURLSession实现的
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//2.发送请求
NSDictionary *param = @{
@"username":@"520it",
@"pwd":@"520it"
//注意:responseObject:请求成功返回的响应结果(AFN内部已经把响应体转换为OC对象,通常是字典或数组)
[manager GET:@"http://120.25.226.186:32812/login" parameters:param success:^(NSURLSessionDataTask * _Nonnull task, id
_Nonnull responseObject) {
NSLog(@"请求成功---%@",[responseObject class]);
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
NSLog(@"失败---%@",error);
(2)使用AFN下载文件
-(void)download
//1.创建一个管理者
AFHTTPSessionManager *manage
= [AFHTTPSessionManager manager];
//2.下载文件
第一个参数:请求对象
第二个参数:下载进度
第三个参数:block回调,需要返回一个url地址,用来告诉AFN下载文件的目标地址
targetPath:AFN内部下载文件存储的地址,tmp文件夹下
response:请求的响应头
返回值:文件应该剪切到什么地方
第四个参数:block回调,当文件下载完成之后调用
response:响应头
filePath:文件存储在沙盒的地址 == 第三个参数中block的返回值
error:错误信息
//2.1 创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_02.png"]];
//2.2 创建下载进度,并监听
NSProgress *progress =
NSURLSessionDownloadTask *downloadTask = [manage downloadTaskWithRequest:request progress:&progress destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
//拼接文件全路径
NSString *fullpath = [caches stringByAppendingPathComponent:response.suggestedFilename];
NSURL *filePathUrl = [NSURL fileURLWithPath:fullpath];
return filePathU
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nonnull filePath, NSError * _Nonnull error) {
NSLog(@"文件下载完毕---%@",filePath);
//2.3 使用KVO监听下载进度
[progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];
//3.启动任务
[downloadTask resume];
//获取并计算当前文件的下载进度
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(NSProgress *)progress change:(NSDictionary&NSString *,id& *)change context:(void *)context
NSLog(@"%zd--%zd--%f",pletedUnitCount,progress.totalUnitCount,1.0 * pletedUnitCount/progress.totalUnitCount);
1.在开发的时候可以创建一个工具类,继承自我们的AFN中的请求管理者,再控制器中真正发请求的代码使用自己封装的工具类。
2.这样做的优点是以后如果修改了底层依赖的框架,那么我们修改这个工具类就可以了,而不用再一个一个的去修改。
3.该工具类一般提供一个单例方法,在该方法中会设置一个基本的请求路径。
4.该方法通常还会提供对GET或POST请求的封装。
5.在外面的时候通过该工具类来发送请求
6.单例方法:
+ (instancetype)shareNetworkTools
static XMGNetworkTools *
static dispatch_once_t onceT
dispatch_once(&onceToken, ^{
// 注意: BaseURL中一定要以/结尾
instance = [[self alloc] initWithBaseURL:[NSURL URLWithString:@"http://120.25.226.186:32812/"]];
2.AFN文件上传
1.文件上传拼接数据的第一种方式
[formData appendPartWithFileData:data name:@"file" fileName:@"xxoo.png" mimeType:@"application/octet-stream"];
2.文件上传拼接数据的第二种方式
[formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"xx.png" mimeType:@"application/octet-stream" error:nil];
3.文件上传拼接数据的第三种方式
[formData appendPartWithFileURL:fileUrl name:@"file" error:nil];
4.【注】在资料中已经提供了一个用于文件上传的分类。
/*文件上传相关的代码如下*/
-(void)upload
//1.创建一个请求管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//2.发送POST请求上传数据
第一个参数:请求路径:NSString类型
第二个参数:要上传的非文件参数
第三个参数:block回调
在该回调中,需要利用formData拼接即将上传的二进制数据
第三个参数:上传成功的block回调
task:dataTask(任务)
responseObject:服务器返回的数据
第四个参数:上传失败的block回调
error:错误信息,如果上传文件失败,那么error里面包含了错误的描述信息
NSDictionary *dict = @{
@"username":@"cherry"
[manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:^(id&AFMultipartFormData&
_Nonnull formData) {
//把本地的图片转换为NSData类型的数据
UIImage *image = [UIImage imageNamed:@"123"];
NSData *data = UIImagePNGRepresentation(image);
//拼接二进制文件数据
第一个参数:要上传的文件的二进制数据
第二个参数:服务器接口规定的名称
第三个参数:这个参数上传到服务器之后用什么名字来进行保存
第四个参数:上传文件的MIMEType类型
[formData appendPartWithFileData:data name:@"file" fileName:@"xxoo.png" mimeType:@"application/octet-stream"];
} success:^(NSURLSessionDataTask * _Nonnull task, id
_Nonnull responseObject) {
NSLog(@"请求成功---%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
NSLog(@"请求失败--%@",error);
-(void)upload2
NSLog(@"%s",__func__);
//1.创建一个请求管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//2.发送POST请求上传数据
第一个参数:请求路径:NSString类型
第二个参数:要上传的非文件参数
第三个参数:block回调
在该回调中,需要利用formData拼接即将上传的二进制数据
第三个参数:上传成功的block回调
task:dataTask(任务)
responseObject:服务器返回的数据
第四个参数:上传失败的block回调
error:错误信息,如果上传文件失败,那么error里面包含了错误的描述信息
NSDictionary *dict = @{
@"username":@"cherry"
[manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:^(id&AFMultipartFormData&
_Nonnull formData) {
//本地文件的url
NSURL *fileUrl = [NSURL fileURLWithPath:@"/Users/文顶顶/Desktop/KF[WTI`AQ3T`A@3R(B96D89.gif"];
//拼接二进制文件数据
第一个参数:要上传文件的url路径
第二个参数:服务器要求的参数名称
第三个参数:这个文件上传到服务器之后叫什么名称
第四个参数:文件的mimetype类型
第五个参数:错误信息
[formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"xx.png" mimeType:@"application/octet-stream" error:nil];
//另外一种上传文件的方式
说明:该方法和上面的方法等价,不过该方法更加简单其内部会自动的的根据url路径确定文件保存名称,并通过内部方法获取上传文件的mimetype类型
[formData appendPartWithFileURL:fileUrl name:@"file" error:nil];
} success:^(NSURLSessionDataTask * _Nonnull task, id
_Nonnull responseObject) {
NSLog(@"请求成功---%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
NSLog(@"请求失败--%@",error);
3.使用AFN进行序列化处理
1.AFN它内部默认把服务器响应的数据当做json来进行解析,所以如果服务器返回给我的不是JSON数据那么请求报错,这个时候需要设置AFN对响应信息的解析方式。AFN提供了三种解析响应信息的方式,分别是:
1)AFXMLParserResponseSerializer----XML
2) AFHTTPResponseSerializer---------默认二进制响应数据
3)AFJSONResponseSerializer---------JSON
2.还有一种情况就是服务器返回给我们的数据格式不太一致(开发者工具Content-Type:text/xml),那么这种情况也有可能请求不成功。解决方法:
1) 直接在源代码中修改,添加相应的Content-Type
2) 拿到这个属性,添加到它的集合中
3.相关代码
-(void)srializer
//1.创建请求管理者,内部基于NSURLSession
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
/* 知识点1:设置AFN采用什么样的方式来解析服务器返回的数据*/
//如果返回的是XML,那么告诉AFN,响应的时候使用XML的方式解析
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
//如果返回的就是二进制数据,那么采用默认二进制的方式来解析数据
//manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//采用JSON的方式来解析数据
//manager.responseSerializer = [AFJSONResponseSerializer serializer];
/*知识点2 告诉AFN,再序列化服务器返回的数据的时候,支持此种类型
[AFJSONResponseSerializer serializer].acceptableContentTypes = [NSSet setWithObject:@"text/xml"];
//2.把所有的请求参数通过字典的方式来装载,GET方法内部会自动把所有的键值对取出以&符号拼接并最后用?符号连接在请求路径后面
NSDictionary *dict = @{
@"username":@"223",
@"pwd":@"ewr",
@"type":@"XML"
//3.发送GET请求
[manager GET:@"http://120.25.226.186:32812/login" parameters:dict success:^(NSURLSessionDataTask * _Nonnull task, id
_Nonnull responseObject) {
//4.请求成功的回调block
NSLog(@"%@",[responseObject class]);
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
//5.请求失败的回调,可以打印error的值查看错误信息
NSLog(@"%@",error);
4.使用AFN来检测网络状态
说明:可以使用AFN框架中的AFNetworkReachabilityManager来监听网络状态的改变,也可以利用苹果提供的Reachability来监听。建议在开发中直接使用AFN框架处理。
//使用AFN框架来检测网络状态的改变
-(void)AFNReachability
//1.创建网络监听管理者
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
//2.监听网络状态的改变
AFNetworkReachabilityStatusUnknown
AFNetworkReachabilityStatusNotReachable
= 没有网络
AFNetworkReachabilityStatusReachableViaWWAN = 3G
AFNetworkReachabilityStatusReachableViaWiFi = WIFI
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知");
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"没有网络");
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"3G");
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WIFI");
//3.开始监听
[manager startMonitoring];
------------------------------------------------------------
//使用苹果提供的Reachability来检测网络状态,如果要持续监听网络状态的概念,需要结合通知一起使用。
//提供下载地址:/library/ios/samplecode/Reachability/Reachability.zip
-(void)touchesBegan:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event
//1.注册一个通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChange) name:kReachabilityChangedNotification object:nil];
//2.拿到一个对象,然后调用开始监听方法
Reachability *r = [Reachability reachabilityForInternetConnection];
[r startNotifier];
//持有该对象,不要让该对象释放掉
//当控制器释放的时候,移除通知的监听
-(void)dealloc
[[NSNotificationCenter defaultCenter] removeObserver:self];
-(void)networkChange
//获取当前网络的状态
if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus == ReachableViaWWAN)
NSLog(@"当前网络状态为3G");
if ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == ReachableViaWiFi)
NSLog(@"当前网络状态为wifi");
NSLog(@"当前没有网络");
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
分享 iOS 开发的知识,解决大家遇到的问题,讨论iOS开发的前沿,欢迎大家投稿~
· 23754人关注
收集 iOS && Android 开发的知识,解决大家遇到的问题,讨论移动前端开发的前沿,欢迎大家投稿~
投稿须知:
· 346人关注
· 98人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:

我要回帖

更多关于 真三国无双7帝国更新 的文章

 

随机推荐