iOS AFN監聽網路,封裝網路請求 —— HERO部落格
阿新 • • 發佈:2019-01-31
對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];
}