2016-01-26 21:44:17 hero_wqb 阅读数 2263

对AFN网络请求进行封装,代码如下:

/************************* .h文件 *************************/
#import <Foundation/Foundation.h>

@interface HWManagerTool : NSObject

/**
 *  发送一个POST请求
 *
 *  @param url     请求路径
 *  @param params  请求参数
 *  @param success 请求成功后的回调
 *  @param failure 请求失败后的回调
 */
+ (void)postWithURL:(NSString *)url params:(NSDictionary *)params success:(void (^)(id json))success failure:(void (^)(NSError *error))failure;

/**
 *  发送一个GET请求
 *
 *  @param url     请求路径
 *  @param params  请求参数
 *  @param success 请求成功后的回调
 *  @param failure 请求失败后的回调
 */
+ (void)getWithURL:(NSString *)url params:(NSDictionary *)params success:(void (^)(id json))success failure:(void (^)(NSError *error))failure;

@end

/************************* .m文件 *************************/
#import "HWManagerTool.h"
#import "AFNetworking.h"

@implementation HWManagerTool

+ (void)postWithURL:(NSString *)url params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure
{
    // 创建请求管理对象
    AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
    session.responseSerializer = [AFJSONResponseSerializer serializer];
    session.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
    
    // 设置超时时间
    [session.requestSerializer willChangeValueForKey:@"timeoutInterval"];
    session.requestSerializer.timeoutInterval = 30.f;
    [session.requestSerializer didChangeValueForKey:@"timeoutInterval"];
    
    // 发送请求
    [session POST:url parameters:params progress:^(NSProgress * _Nonnull uploadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (success) {
            success(responseObject);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failure) {
            failure(error);
        }
    }];
}

+ (void)getWithURL:(NSString *)url params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure
{
    // 创建请求管理对象
    AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
    session.responseSerializer = [AFJSONResponseSerializer serializer];
    session.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
    
    // 设置超时时间
    [session.requestSerializer willChangeValueForKey:@"timeoutInterval"];
    session.requestSerializer.timeoutInterval = 30.f;
    [session.requestSerializer didChangeValueForKey:@"timeoutInterval"];
    
    // 发送请求
    [session GET:url parameters:params progress:^(NSProgress * _Nonnull downloadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (success) {
            success(responseObject);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failure) {
            failure(error);
        }
    }];
}

@end

对项目网络请求进行封装,代码如下:

/************************* .h文件 *************************/
#import <Foundation/Foundation.h>

@interface HWNetwork : NSObject

// 登录
+ (void)postLoginInfoWithUsername:(NSString *)username password:(NSString *)password success:(void (^)(id json))success failure:(void (^)(NSError *error))failure;

// 首页信息
+ (void)getHomeInfoSuccess:(void (^)(id json))success failure:(void (^)(NSError *error))failure;

@end

/************************* .m文件 *************************/
#import "HWNetwork.h"
#import "HWManagerTool.h"

#define KIP @"https://api.ceshi.com"

// 登录
#define KLoginInfo [NSString stringWithFormat:@"%@/index.php?s=public/login", KIP]

// 首页信息
#define KHomeInfo [NSString stringWithFormat:@"%@/index.php?s=public/home", KIP]

@implementation HWNetwork

// 登录
+ (void)postLoginInfoWithUsername:(NSString *)username password:(NSString *)password success:(void (^)(id json))success failure:(void (^)(NSError *error))failure
{
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    [params setValue:username forKey:@"phone"];
    [params setValue:password forKey:@"password"];
    
    [HWManagerTool postWithURL:KLoginInfo params:params success:^(id json) {
        if (success) {
            success(json);
        }
    } failure:^(NSError *error) {
        if (failure) {
            failure(error);
        }
    }];
}

// 首页信息
+ (void)getHomeInfoSuccess:(void (^)(id json))success failure:(void (^)(NSError *error))failure
{
    [HWManagerTool getWithURL:KHomeInfo params:nil success:^(id json) {
        if (success) {
            success(json);
        }
    } failure:^(NSError *error) {
        if (failure) {
            failure(error);
        }
    }];
}

@end

控制器调用:

- (void)getInfo
{
    // 登录
    [HWNetwork postLoginInfoWithUsername:@"asdf" password:@"123456" success:^(id json) {
        
    } failure:^(NSError *error) {
        
    }];
    
    // 获取首页信息
    [HWNetwork getHomeInfoSuccess:^(id json) {
        
    } failure:^(NSError *error) {
        
    }];
}


利用AFN监听网络改变,封装为单利,代码如下:

/************************* .h文件 *************************/
#import "AFNetworkReachabilityManager.h"

@interface HWNetworkReachabilityManager : NSObject

// 当前网络状态
@property (nonatomic, assign, readonly) AFNetworkReachabilityStatus networkReachabilityStatus;

// 获取单例
+ (instancetype)shareManager;

// 监听网络状态
- (void)monitorNetworkStatus;


/************************* .m文件 *************************/
#import "HWNetworkReachabilityManager.h"

@interface HWNetworkReachabilityManager ()

@property (nonatomic, assign, readwrite) AFNetworkReachabilityStatus networkReachabilityStatus;

@end

@implementation HWNetworkReachabilityManager

+ (instancetype)shareManager
{
    static HWNetworkReachabilityManager *manager = nil;
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[self alloc] init];
    });
    
    return manager;
}

// 监听网络状态
- (void)monitorNetworkStatus
{
    // 创建网络监听者
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];

    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusUnknown:
                // 未知网络,这里可以处理公共网络变更事件
                HWLog(@"当前网络:未知网络");
                break;
                
            case AFNetworkReachabilityStatusNotReachable:
                // 无网络
                HWLog(@"当前网络:无网络");
                break;
                
            case AFNetworkReachabilityStatusReachableViaWWAN:
                // 蜂窝数据
                HWLog(@"当前网络:蜂窝数据");
                break;
                
            case AFNetworkReachabilityStatusReachableViaWiFi:
                // 无线网络
                HWLog(@"当前网络:无线网络");
                break;
                
            default:
                break;
        }
        
        if (_networkReachabilityStatus != status) {
            _networkReachabilityStatus = status;
            // 网络改变通知,单独网络变更事件可以添加通知实现
            [[NSNotificationCenter defaultCenter] postNotificationName:HWNetworkingReachabilityDidChangeNotification object:[NSNumber numberWithInteger:status]];
        }
    }];
    
    // 开始监听
    [manager startMonitoring];
}

@end

在appDelegate中开启监听:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // 开启网络监听
    [[HWNetworkReachabilityManager shareManager] monitorNetworkStatus];
    
    return YES;
}

其它控制器添加通知获取事件:

// 网路改变通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkingReachabilityDidChange:) name:HWNetworkingReachabilityDidChangeNotification object:nil];

#pragma mark - HWNetworkingReachabilityDidChangeNotification
- (void)networkingReachabilityDidChange:(NSNotification *)notification
{

}

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
2015-02-09 18:50:57 only3324 阅读数 327

使用AFN需要先导入库文件有:MobileCoreServices.framework、SystemConfiguration.framework、CoreGraphics.framework、CoreLocation.framework、Foundation.framework、UIKit.framework、Security.framework;其次需要引入AFN的第三方文件(AFNetWorking),然后在需要使用AFN的文件中引入头文件即可。以下为示例:



#import "ViewController.h"

#import "AFNetworking.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    [self afn];

}


-(void)afn

{

    AFNetworkReachabilityManager *netWorkManager = [AFNetworkReachabilityManager sharedManager];

    NSLog(@"%d",netWorkManager.isReachable);

    //url接口

        NSString *url_string = [NSString stringWithFormat:@"http://project.lanou3g.com/teacher/yihuiyun/lanouproject/activitylist.php"];

        NSLog(@"%@",url_string);

        AFHTTPRequestOperationManager* manager = [AFHTTPRequestOperationManager manager];

    // @"text/javascript"

    //AFHTTPRequestOperationManager的属性//文件类型

        manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

    //AFHTTPRequestOperationManager GET异步,文件获取是否成功

        [manager GET:url_string parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

            [netWorkManager stopMonitoring];

            NSLog(@"object ===  %@",responseObject);

                    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

            NSLog(@"失败 %@",error);

        }];

}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end



2017-04-20 23:33:33 dengwt123 阅读数 260

一个iOS app最基本的功能是发送接收数据,今天就谈一下iOS 怎么通过AFN3.0进行通信的。

1.引入AFN3.0头文件。

#import "AFNetworking.h"


2.编写相关请求发送数据的方法。

+(BOOL)sendMessage:(NSString*)title describe:(NSString*)describe url:(NSString*)url{

    AFHTTPSessionManager* manager=[AFHTTPSessionManager manager];

    //设置可接受的数据类型

    manager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"application/json",@"text/html",@"image/jpeg",@"image/png",@"application/octet-stream",@"text/json",nil];

//设置以什么样的形式接收和发送数据,这里是二进制的形式

    manager.requestSerializer=[AFHTTPRequestSerializer serializer];

    manager.responseSerializer=[AFHTTPResponseSerializer serializer];

//    NSData* da=[describe dataUsingEncoding:NSUTF8StringEncoding];

//设置请求的头部,这里最好设置一下,因为struts2接收数据的话如果你没有设置这个它是接收不了的

    [manager.requestSerializer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

    //开始上传

    

    [manager POST:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData>_Nonnull FormData) {

//添加请求体,也就是要发送的数据

        NSData *des=[describe dataUsingEncoding:NSUTF8StringEncoding];

        NSLog(@"%@", describe);

        [FormData appendPartWithFormData:des name:title];

    } progress:^(NSProgress * _Nonnull uploadProgress) {

        

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        NSLog(@"上传成功");

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        NSLog(@"上传失败:%@",error);

    }];

    return YES;

}

3.测试一下看看是否可行。

可以看到是没有问题的。

2017-06-17 23:08:40 shihuboke 阅读数 220

 //联系人:石虎  QQ: 1224614774 昵称:嗡嘛呢叭咪哄


AFN 小节


功能:

-对 NSURLConnection & NSURLSession 的封装

-提供了自动序列化和反序列化功能

-提供了完善的错误处理机制


使用:

-由于大多数的网络请求都是针对一个服务器发起的,所以可以定义一个全局的 manager 统一管理!

-绝大多数的使用非常方便

-需要注意的是:默认请求的数据格式是二进制的,响应的数据格式是JSON

如果不是响应的数据格式,需要修改

-当针对上传、下载任务的进度跟进,不是很方便

1> 利用 NSProgress + KVO

2> 利用 UIProgressView+AFNetworking分类


最多的问题:

-如果有特殊的网络请求,如何解决?

1. 准备 NSURL

2. 准备 NSURLRequest

3. 使用 manager request 方法,直接建立网络连接,将请求发送给服务器就行了!


在网络开发中,真正变化最大的部分-> NSURLRequest,因为以下愿意:

1. HTTP的方法,GET/POST/PUT/DELETE/HEAD/PATCH

2. 请求头的变化:

-内容类型 Content-Type POST 上传!

-身份验证

-浏览器的类型 User-Agent

-网络的重定向,服务器可以根据客户端的类型,转向最适合的页面!



iOS AFN
2016-02-29 14:21:36 tongwei117 阅读数 702
#define kActivityList @"http://project.lanou3g.com/teacher/yihuiyun/lanouproject/activitylist.php"  // 活动列表 get

#define kNewsListURL @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"  // post请求
#define kNewsListParam @"date=20151102&startRecord=1&len=30&udid=1234567890&terminalType=Iphone&cid=213" //body

#define kImageURL @"http://image.zcool.com.cn/56/13/1308200901454.jpg" // 图片, 下载用

#define kSearchURL @"http://api.map.baidu.com/place/v2/search?query=肯德基&region=北京&output=json&ak=6E823f587c95f0148c19993539b99295" // 带汉字的接口, 需要转码

post请求

// POST
- (void)post
{
    // 1.创建AFN管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    // 2.利用AFN管理者发送请求
    NSDictionary *params = @{
                             @"date" : @"20151102",
                             @"startRecord" : @"1",
                             @"len" : @"30",
                             @"udid" : @"1234567890",
                             @"terminalType" : @"Iphone",
                             @"cid" : @"213"
                             };
    // date=20151102&startRecord=1&len=30&udid=1234567890&terminalType=Iphone&cid=213
    [manager POST:kNewsListURL parameters:params success:^
     (NSURLSessionDataTask *task, id responseObject) {
         NSLog(@"请求成功---%@", responseObject);
     } failure:^(NSURLSessionDataTask *task, NSError *error) {
         NSLog(@"请求失败---%@", error);
     }];
}

get请求

#pragma mark -- get请求
- (void)getjson
{
//    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//    [manager GET:kActivityList parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
//        NSLog(@"%@", responseObject);  // 这个接口的类型是 text/html
//    } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
//        NSLog(@"-----%@", error);
//    }];
    NSString *string = [kSearchURL stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    NSLog(@"%@", string);
    NSURL *URL = [NSURL URLWithString:kActivityList];
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    [manager GET:URL.absoluteString parameters:nil success:^(NSURLSessionTask *task, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
    } failure:^(NSURLSessionTask *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}

文件上传

#pragma mark -- 文件上传
- (void)upload
{
    // 1.创建网络管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    // 2.利用网络管理者上传数据
    NSDictionary *dict = @{@"username":@"Syl"};
    // formData: 专门用于拼接需要上传的数据
    [manager POST:@"http://120.25.226.186:32812/upload" parameters:dict
constructingBodyWithBlock:
     ^void(id<AFMultipartFormData> formData) {
         /*
          Data: 需要上传的数据
          name: 服务器参数的名称
          fileName: 文件名称
          mimeType: 文件的类型
          */
         UIImage *image =[UIImage imageNamed:@"hetu"];
         NSData *data = UIImagePNGRepresentation(image);
         [formData appendPartWithFileData:data name:@"file" fileName:@"hetu.png"
                                 mimeType:@"image/png"];
         /*
          NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/
          CertificateSigningRequest.certSigningRequest"];
          // 任意的二进制数据MIMEType application/octet-stream
          // [formData appendPartWithFileURL:url name:@"file" fileName:@"abc.cer"
          mimeType:@"application/octet-stream" error:nil];
          [formData appendPartWithFileURL:url name:@"file" error:nil];
          */
     } success:^void(NSURLSessionDataTask * task, id responseObject) {
         // 请求成功
         NSLog(@"请求成功 %@", responseObject);
     } failure:^void(NSURLSessionDataTask * task, NSError * error) {  
         // 请求失败  
         NSLog(@"请求失败 %@", error);  
     }];
}

文件下载

#pragma mark -- 文件下载
// 执行下载文件的方法,可以监控下载进度
- (void)downLoadMonitor
{
    // 1.创建网络管理者
    // AFHTTPSessionManager 基于NSURLSession
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
   // NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    // 2.利用网络管理者下载数据
    // http://vss.waqu.com/dusdcsuang6u5btu/normal.mp4 视频的网址

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:kImageURL]];
    /*
     destination
     - targetPath: 系统给我们自动写入的文件路径
     - block的返回值, 要求返回一个URL, 返回的这个URL就是剪切的位置的路径
     completionHandler
     - url :destination返回的URL == block的返回的路径
     */
    /*
     @property int64_t totalUnitCount;  需要下载文件的总大小
     @property int64_t completedUnitCount; 当前已经下载的大小
     */
    NSProgress *progress = nil;
    NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
        // 缓存文件,如果想将缓存文件存到磁盘 SDURLCache
        NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
        NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
        return [NSURL fileURLWithPath:path];

    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
        NSLog(@"%@",filePath.absoluteString);
    }];

    /* 
     要跟踪进度,需要使用 NSProgress,是在 iOS 7.0 推出的,专门用来跟踪进度的类! 
     NSProgress只是一个对象!如何跟踪进度!-> KVO 对属性变化的监听! 
     @property int64_t totalUnitCount;        总单位数 
     @property int64_t completedUnitCount;    完成单位数 
     */  
    // 给Progress添加监听 KVO  
    [progress addObserver:self forKeyPath:@"completedUnitCount"   
                  options:NSKeyValueObservingOptionNew context:nil];  
    // 启动任务
    [downTask resume];  
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{

}

iOS开发之使用AFN上传图片

博文 来自: l2i2j2

iOS--AFN实现原理

阅读数 4404

AFN的基本实现原理和应用

博文 来自: c386890506
没有更多推荐了,返回首页