美文网首页
AFN的二次封装单例类

AFN的二次封装单例类

作者: 全栈的猫南北 | 来源:发表于2021-02-22 14:15 被阅读0次

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

.h文件

#import <Foundation/Foundation.h>
#import <AFNetworking/AFNetworking.h>


typedef enum{
    requestTypeGET,
    requestTypePOST
}requestType;

@interface NetworkManger : AFHTTPSessionManager

//单例
+ (instancetype)shareNetworkManger;
+(id)allocWithZone:(NSZone *)zone;

//第一次封装请求类型
- (void)requestWithType:(requestType)type URLString:(nonnull NSString *)URLString parameters:(nullable id)parameters progress:(nullable void (^)(NSProgress *_Nonnull downloadProgress))downloadProgress success:(nullable void (^)(NSURLSessionDataTask *_Nullable task, id _Nullable responseObject))success
                failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *_Nonnull error))failure;

//第二次封装,简化参数,把没有用的参数去掉
- (void)requestWithType:(requestType)type URLString:(nonnull NSString *)URLString parameters:(nullable id)parameters success:(nullable void (^)(id _Nullable responseObject))success  failure:(nullable void (^)(NSError *_Nonnull error))failure;

//第三次封装,直接使用类方法,外部调用单例避免重复
+ (void)requestWithType:(requestType)type URLString:(nonnull NSString *)URLString parameters:(nullable id)parameters success:(nullable void (^)(id _Nullable responseObject))success  failure:(nullable void (^)(NSError *_Nonnull error))failure;
@end

.m文件

#import "NetworkManger.h"

static NetworkManger *instance;

@implementation NetworkManger

+ (instancetype)shareNetworkManger {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{    
         if (instance == nil) {
           instance = [super allocWithZone:zone];
        }
        //  让AFN默认也支持接收text/html文件类型
        instance.responseSerializer.acceptableContentTypes
        = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html",@"text/plain", nil];
    });
    return instance;
}

//MARK: 一次封装的网络工具类
- (void)requestWithType:(requestType)type URLString:(NSString *)URLString parameters:(nullable id)parameters progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgress success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure{
    if (type == requestTypeGET) {
        [instance GET:URLString parameters:parameters progress:downloadProgress success:success failure:failure];
    } else if (type == requestTypePOST) {
        [instance POST:URLString parameters:parameters progress:downloadProgress success:success failure:failure];
    }
}

//MARK: 二次封装的网络工具类
- (void)requestWithType:(requestType)type URLString:(nonnull NSString *)URLString parameters:(nullable id)parameters success:(nullable void (^)(id _Nullable responseObject))success  failure:(nullable void (^)(NSError *_Nonnull error))failure{
    //(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
    void (^orginalSuccess)(NSURLSessionDataTask * _Nullable, id  _Nullable) = ^(NSURLSessionDataTask * _Nullable task, id  _Nullable responseObject) {
//        success((NSDictionary *)responseObject);
        success(responseObject);
    };
    //(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure
    void (^orginalFailure)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull) = ^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        failure(error);
    };
    [self requestWithType:type URLString:URLString parameters:parameters progress:nil success:orginalSuccess failure:orginalFailure];
}

//MARK: 三次封装的网络工具类
+ (void)requestWithType:(requestType)type URLString:(nonnull NSString *)URLString parameters:(nullable id)parameters success:(nullable void (^)(id _Nullable responseObject))success  failure:(nullable void (^)(NSError *_Nonnull error))failure {
    [[NetworkManger shareNetworkManger] requestWithType:type URLString:URLString parameters:parameters success:success failure:failure];
}

+(id)allocWithZone:(NSZone *)zone{
  return [NetworkManger shareNetworkManger];
}
// 为了严谨,也要重写copyWithZone 和 mutableCopyWithZone
-(id)copyWithZone:(NSZone *)zone{
    return [NetworkManger shareNetworkManger];
}
-(id)mutableCopyWithZone:(NSZone *)zone{
    return [NetworkManger shareNetworkManger];
}

相关文章

  • iOS 项目用AFN二次封装框架

    背景: 上一个项目中对AFN的二次封装:是写一个单例的基类,基类持有AFN请求对象,具体的业务通过继承基类来区分,...

  • AFN的二次封装单例类

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

  • swift封装AFNetworking

    以前自己用swift封装的AFN,封装成工具类直接拖就能用 首先把工具类设计成单例对象 然后自己封装了网络请求方法

  • 单例模式

    单例模式是封装的一种形式,依靠单例模式调用被封装的属性和方法,因为使用单例模式的类无法生成实例(只能引用单例模式所...

  • AFN检测网络状态

    使用AFN检测网络网络状态,使用的类AFHTTPSessionManager 1.初始化单例 _sharedCli...

  • OkHttp的简单封装使用

    封装单例工具类,包含get和post请求 调用方式

  • iOS-网络相关

    本篇涵盖AFN、ASI、封装网络请求等. 1.iOS网络请求之ASI与AFN的二次封装及意义2.LXNetwork...

  • OkHttp单例封装类

    //导okhttp依赖compile 'com.squareup.okhttp3:okhttp:3.8.1' pu...

  • 单例

    单例个人觉得,单例用的比较多的是对工具类的封装,使用单例,可以很方面的进行模块间传值或者是工具类方法的使用。 一般...

  • iOS单例模式

    单例模式 解决“应用中只有一个单例”的一类问题。 Objecttive-C实现原理 单例模式一般会封装一个静态属性...

网友评论

      本文标题:AFN的二次封装单例类

      本文链接:https://www.haomeiwen.com/subject/juvhfltx.html