AFNetworking源码(一)

0.535字数 180阅读 120

前言

AFNetworking是一个为 iOS 和 Mac OSX 制作的令人愉快的网络库,它建立在URL 装载系统框架的顶层,内置在Cocoa里,扩展了强有力的高级网络抽象。以最新的3.1.0版本读阅.本篇只对其基本使用方法作介绍,不涉及ji'shu

AFNetworking版权.png

介绍

AFNetworking 大致分为五个模块:
AFN的五大模块.png
  • 对外接口和请求处理文件
  • 发送和响应管理文件
  • 安全策略文件
  • 网路状态监听文件
  • UIKit相关扩展文件
注:框架内部也是按照这几种功能,做的文件夹分类

基本使用

创建

//创建请求
AFHTTPSessionManger *manger = [AFHTTPSession manger];

/**
 The dispatch queue for `completionBlock`. If `NULL` (default), the main queue is used.
 */
manger.completionQueue;
//回调执行所在线程  不传默认在主线程执行

/**
 The dispatch group for `completionBlock`. If `NULL` (default), a private dispatch group is used.
 */
manger.completionGroup;
//回调执行所在组  不传默认在AFN内部的私有组执行

/**
 Whether to attempt to retry creation of upload tasks for background sessions when initial call returns `nil`. `NO` by default.
 */
manger.attemptsToRecreateUploadTasksForBackgroundSessions
//这个属性非常重要,注释里面写到,在iOS7中存在一个bug,在创建后台上传任务时,有时候会返回nil,所以为了解决这个问题,AFNetworking遵照了苹果的建议,在创建失败的时候,会重新尝试创建,次数默认为3次,所以你的应用如果有场景会有在后台上传的情况的话,记得将该值设为YES,避免出现上传失败的问题.

一、请求服务器数据

GET请求
NSString *url = @"http://example.com/";

//发送请求
[manager GET: url parameters:@"" progress:^(NSProgress * _Nonnull downloadProgress) {
     // 进度
 } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
     // 成功回调   
 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
     // 失败回调
}];

POST请求
//发送请求
[manager POST:@"" parameters: url progress:^(NSProgress * _Nonnull downloadProgress) {
     // 进度
 } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
     // 成功回调   
 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
     // 失败回调
}];

二、下载数据

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
    NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
    return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
    NSLog(@"File downloaded to: %@", filePath);
}];
[downloadTask resume];

三、上传数据

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"file://path/to/image.jpg"] name:@"file" fileName:@"filename.jpg" mimeType:@"image/jpeg" error:nil];
    } error:nil];

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

NSURLSessionUploadTask *uploadTask;
uploadTask = [manager
              uploadTaskWithStreamedRequest:request
              progress:^(NSProgress * _Nonnull uploadProgress) {
                  // This is not called back on the main queue.
                  // You are responsible for dispatching to the main queue for UI updates
                  dispatch_async(dispatch_get_main_queue(), ^{
                      //Update the progress view
                      [progressView setProgress:uploadProgress.fractionCompleted];
                  });
              }
              completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
                  if (error) {
                      NSLog(@"Error: %@", error);
                  } else {
                      NSLog(@"%@ %@", response, responseObject);
                  }
              }];

[uploadTask resume];

四、网络监测

//创建一个单例manager
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
//监测网络状态改变
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"没有网络");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"连接到路由器网络不能到达");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"2G/3G/4G");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"wifi");
break;
}
}];
//开启检测
[manager startMonitoring];
注:以上所写全是基本接口, 使用起来太复杂,可以根据自己项目需要进行封装

推荐阅读更多精彩内容