iOS AFN的再次封装

我用一个单例类将一些常用的网络请求进行了二次封装,主要包括post请求 get请求  图片文件上传下载  视频的断点续传等功能。

首先大家先去github上下载AFN,将文件夹内的AFNetworking文件夹拖入工程中,然后创建一个图片文件参数类代码如下:

#import <Foundation/Foundation.h>

@interface UploadParam : NSObject
/**
 *  上传文件的二进制数据
 */
@property (nonatomic, strong) NSData *data;
/**
 *  上传的参数名称
 */
@property (nonatomic, copy) NSString *name;
/**
 *  上传到服务器的文件名称
 */
@property (nonatomic, copy) NSString *fileName;

/**
 *  上传文件的类型
 */
@property (nonatomic, copy) NSString *mimeType;

@end
#import "UploadParam.h"

@implementation UploadParam

@end

然后创建网络工具AFNManager具体代码如下(此处我提供了代理和block两种方式进行传值供大家选择):

#import <Foundation/Foundation.h>
#import "AFNManagerDelegate.h"
#import "UploadParam.h"
@interface AFNManager : NSObject

@property (nonatomic, weak) id<AFNManagerDelegate> delegate;

/**
 *  AFNManager单利
 */
+(AFNManager *)sharedManager;
#pragma mark --代理的方式传值
/**
 *  get
 */
- (void)GET:(NSString *)URLString parameters:(id)parameters;

/**
 *  post
 */
- (void)Post:(NSString *)URLString parameters:(id)parameters;

/**
 *  upload
 */
- (void)Upload:(NSString *)URLString parameters:(id)parameters uploadParam:(UploadParam *)uploadParam;

#pragma mark --block的形式传值
/**
 *  get请求
 */
- (void)GET:(NSString *)URLString parameters:(id)parameters succeed:(void (^)(id data))succeed failure:(void (^)(NSError *error))failure;
/**
 *  post请求
 */
- (void)Post:(NSString *)URLString parameters:(id)parameters succeed:(void (^)(id data))succeed failure:(void (^)(NSError *error))failure;
/**
 *  upload
 */
- (void)Upload:(NSString *)URLString parameters:(id)parameters uploadParam:(UploadParam *)uploadParam succeed:(void (^)(id data))succeed failure:(void (^)(NSError *error))failure;

#pragma mark --断点续传
/**
 *  开始下载  断点续传
 *
 *  @param URLString 请求接口
 */
- (void)downloadStartWithUrl:(NSString *)URLString fileName:(NSString *)fileName;
/**
 *  开始上传  断点续传
 *
 *  @param URLString 请求接口
 */
- (void)uploadStartWithUrl:(NSString *)URLString fileData:(NSData *)fileData;
/**
 *  暂停操作  断点续传
 */
- (void)operationPause;
/**
 *  继续操作  断点续传
 */
- (void)operationResume;
/**
 *  取消操作
 */
- (void)operationCancel;
@end
#import "AFNManager.h"
#import "AFNetworking.h"
@interface AFNManager()
{
    AFHTTPRequestOperation *operation; //创建请求管理(用于上传和下载)
}
@end
static AFNManager *manager = nil;
@implementation AFNManager
+(AFNManager *)sharedManager
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (manager == nil) {
            manager = [[self alloc] init];
        }
    });
    return manager;
}

+(instancetype)allocWithZone:(struct _NSZone *)zone
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (manager == nil) {

            manager = [super allocWithZone:zone];
        }
    });
    return manager;
}
- (void)GET:(NSString *)URLString parameters:(id)parameters
{
    // 创建请求管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

    [mgr GET:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {

        if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) {

            [self.delegate AFNManagerDidSuccess:responseObject];
        }

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) {

            [self.delegate AFNManagerDidFaild:error];
        }
    }];
}

- (void)Post:(NSString *)URLString parameters:(id)parameters
{
    // 创建请求管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

    [mgr POST:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {

        if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) {

            [self.delegate AFNManagerDidSuccess:responseObject];
        }

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

        if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) {

            [self.delegate AFNManagerDidFaild:error];
        }
    }];
}

- (void)Upload:(NSString *)URLString parameters:(id)parameters uploadParam:(UploadParam *)uploadParam
{
    // 创建请求管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

    [mgr POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { // 上传的文件全部拼接到formData

        /**
         *  FileData:要上传的文件的二进制数据
         *  name:上传参数名称
         *  fileName:上传到服务器的文件名称
         *  mimeType:文件类型
         */
        [formData appendPartWithFileData:uploadParam.data name:uploadParam.name fileName:uploadParam.fileName mimeType:uploadParam.mimeType];

    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
        if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) {

            [self.delegate AFNManagerDidSuccess:responseObject];
        }

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) {

            [self.delegate AFNManagerDidFaild:error];
        }
    }];

}
-(void)GET:(NSString *)URLString parameters:(id)parameters succeed:(void (^)(id))succeed failure:(void (^)(NSError *))failure
{
    // 创建请求管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

    [mgr GET:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
        if (responseObject == nil) {
            return ;
        }
        succeed(responseObject);

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

        failure(error);
    }];
}
-(void)Post:(NSString *)URLString parameters:(id)parameters succeed:(void (^)(id))succeed failure:(void (^)(NSError *))failure
{
    // 创建请求管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

    [mgr POST:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
        if (responseObject == nil) {
            return ;
        }
        succeed(responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        failure(error);
    }];

}
-(void)Upload:(NSString *)URLString parameters:(id)parameters uploadParam:(UploadParam *)uploadParam succeed:(void (^)(id))succeed failure:(void (^)(NSError *))failure
{
    // 创建请求管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

    [mgr POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { // 上传的文件全部拼接到formData

        /**
         *  FileData:要上传的文件的二进制数据
         *  name:上传参数名称
         *  fileName:上传到服务器的文件名称
         *  mimeType:文件类型
         */
        [formData appendPartWithFileData:uploadParam.data name:uploadParam.name fileName:uploadParam.fileName mimeType:uploadParam.mimeType];

    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
        if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) {

            succeed(responseObject);
        }

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) {

            failure(error);
        }
    }];

}
-(void)downloadStartWithUrl:(NSString *)URLString fileName:(NSString *)fileName
{
    NSString *filePath = [NSString stringWithFormat:@"%@/Documents/%@",NSHomeDirectory(), fileName];

    operation = [[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:URLString]]];

    operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];
//    可以在此设置进度条

//    [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
//
//    }];
    __weak typeof(self) weakself = self;
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        //        请求成功做出提示
        if (weakself.delegate && [weakself.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) {

            [weakself.delegate AFNManagerDidSuccess:responseObject];
        }

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        //        请求失败做出提示
        if (weakself.delegate && [weakself.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) {

            [weakself.delegate AFNManagerDidFaild:error];
        }
    }];

    [operation start];
}
- (void)uploadStartWithUrl:(NSString *)URLString fileData:(NSData *)fileData
{
    operation = [[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:URLString]]];

    operation.inputStream = [[NSInputStream alloc] initWithData:fileData];

//    设置进度条
//    [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
//
//    }];
    __weak typeof(self) weakself = self;
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        //        请求成功做出提示
        if (weakself.delegate && [weakself.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) {

            [weakself.delegate AFNManagerDidSuccess:responseObject];
        }

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        //        请求失败做出提示
        if (weakself.delegate && [weakself.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) {

            [weakself.delegate AFNManagerDidFaild:error];
        }
    }];

    [operation start];
}
- (void)operationPause
{
    [operation pause];
}
- (void)operationResume
{
    [operation resume];
}
- (void)operationCancel
{
    [operation cancel];
}

//网络监听(用于检测网络是否可以链接。此方法最好放于AppDelegate中,可以使程序打开便开始检测网络)
- (void)reachabilityManager
{
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
    //打开网络监听
    [mgr.reachabilityManager startMonitoring];

    //监听网络变化
    [mgr.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {

                //当网络不可用(无网络或请求延时)
            case AFNetworkReachabilityStatusNotReachable:
                break;

                //当为手机WiFi时
            case AFNetworkReachabilityStatusReachableViaWiFi:
                break;

                //当为手机蜂窝数据网
            case AFNetworkReachabilityStatusReachableViaWWAN:
                break;

                //其它情况
            default:
                break;
        }
    }];

    //    //停止网络监听(若需要一直检测网络状态,可以不停止,使其一直运行)
//    [mgr.reachabilityManager stopMonitoring];
}

@end

网络工具代理协议代码如下:

#import <Foundation/Foundation.h>
@class AFNManager;

@protocol AFNManagerDelegate <NSObject>

@optional
/**
 *  发送请求成功
 *
 *  @param manager AFNManager
 */
-(void)AFNManagerDidSuccess:(id)data;
/**
 *  发送请求失败
 *
 *  @param manager AFNManager
 */
-(void)AFNManagerDidFaild:(NSError *)error;
@end
时间: 2024-08-26 06:42:21

iOS AFN的再次封装的相关文章

ajax的再次封装!

js的动态加载.缓存.更新以及复用 系列有点卡文,放心会继续的.先来点更基础的,为js的加载做点铺垫.   jQuery的ajax本来就很方便了,为啥还要在进一步的封装呢?这个首先要看项目的具体需求了,如果觉得不需要,那么完全可以直接用jQuery提供的各种ajax的方法.如果像我似地,感觉不太方便的话,那么完全可以按照自己的想法和需求来再次封装一下.   需求: 1.调用的时候更加的简单. 2.可以灵活的做各种设置和变化. 3.可以满足一些通用的需求.比如出错的时候给出提示.   项目现状:

ajax的再次封装!(改进版) —— new与不 new 有啥区别?

  生命不息重构不止!   上一篇写了一下我对ajax的再次封装的方法,收到了很多有价值的回复,比如有童鞋建议用$.extend,一开始还以为要做成插件呢,后来才知道,原来这个东东还可以实现合并.省着自己再去做判断了.   还有童鞋说"要不要多加点传入参数",这一下提醒我了,ajax有很多参数呀,常用的我考虑进来了,但是还有很多不常用的呢,如果需要的话怎么办?在看看我调用原生ajax的方式,kao,完全不支持增加其他参数吗,这怎么行,改一定要改.于是就改成了这样.   1 //对aja

大玩移动健康监测:iOS 8欲再次改变世界

笔者按:对于iOS系统,笔者一直是颇为欣赏的.相比Android系统的繁杂.WP系统的不人性化.Ubuntu系统的薄弱.Firefox系统的不靠谱--iOS系统可谓高大上了许多.而其一举一动引颇为引人注意,即使是小版本的更迭也颇为引人注意,更何况也许即将在今年发布的iOS 8系统. 对于有可能在今年发布的iOS 8系统,人们可谓浮想联翩.而和往常一样,网上的"无聊人士"在不断设计出iOS 8的想象概念图.虽然其中的真假成分有多少尚值得商榷,但也恰恰说明了人们对总是给出最大惊喜的苹果有着

iOS开发拓展篇—封装音频文件播放工具类

一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - (id)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError; - (id)initWithData:(NSData *)data error:(NSError **)outError; 准备播放(缓冲,提高播放的流畅性) - (BOOL)prepareToPlay;

iOS中 用FMDB封装一个SQLite数据库

建立一个单例: DataBaseHandle.h #import <Foundation/Foundation.h> @class PersonModel; @class FMDatabase; @interface DataBaseHandle : NSObject @property(nonatomic,retain)FMDatabase *db; //创建单例的的接口 + (DataBaseHandle *)shareDateBaseHandle; //创建一个Person表格 - (v

iOS 数据库离线缓存思路和网络层封装

一直想总结一下关于iOS的离线数据缓存的方面的问题,然后最近也简单的对AFN进行了再次封装,所有想把这两个结合起来写一下.数据展示型的页面做离线缓存可以有更好的用户体验,用户在离线环境下仍然可以获取一些数据,这里的数据缓存首选肯定是SQLite,轻量级,对数据的存储读取相对于其他几种方式有优势,这里对AFN的封装没有涉及太多业务逻辑层面的需求,主要还是对一些方法再次封装方便使用,解除项目对第三方的耦合性,能够简单的快速的更换底层使用的网络请求代码.这篇主要写离线缓存思路,对AFN的封装只做简单的

IOS封装自定义布局的方法_IOS

一.概述 1.对于经常使用的控件或类,通常将其分装为一个单独的类来供外界使用,以此达到事半功倍的效果 2.由于分装的类不依赖于其他的类,所以若要使用该类,可直接将该类拖进项目文件即可 3.在进行分装的时候,通常需要用到代理设计模式二.代理设计模式1.代理设计模式的组成客户类(通常作为代理):通常委托这是角色来完成业务逻辑真实角色:将客户类的业务逻辑转化为方法列表,即代理协议代理协议: 定义了需要实现的业务逻辑 定义了一组方法列表,包括必须实现的方法或选择实现的方法 代理协议是代理对象所要遵循一组

iOS下拉选择菜单简单封装_IOS

本文实例为大家分享了简单封装的iOS下拉选择菜单代码,供大家参考,具体内容如下 // // OrderListDownMenu.h #import <UIKit/UIKit.h> @protocol OrderListDownMenuDelegate <NSObject> - (void)OrderListDownMenu:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath; @end

iOS开发之微信聊天工具栏的封装_IOS

微信大家基本上都用过,今天要做的就是微信的聊天工具条.聊天工具条还是比较复杂的,其中包括发送表情,发送文字,发送图片,发送声音,拍照等等功能,下面给出发送录音,文字,表情的代码,其他的和这几样类似.还是那句话百字不如一图,先来几张效果图吧. 在封装聊天工具条的的时候表情键盘是之前封装好的,所以拿过来就可以用的啦.因为不管是工具条还是表情键盘都是用约束来控件大小的,所以横屏也是没问题的,在大屏手机上也是没问题的.下面将会一步步讲解如何封装下面的聊天工具条.主要是对工具条的封装,表情键盘在这就不做讲