1. 程式人生 > >iOS AFN監聽網路,封裝網路請求 —— HERO部落格

iOS AFN監聽網路,封裝網路請求 —— HERO部落格

對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];
}