學(xué)而時(shí)習(xí)之雀鹃,不亦樂(lè)乎,大家好励两,我是張杰黎茎。
iOS開(kāi)發(fā)做久了不免就是復(fù)制了黏貼了,代碼積累多了就不想敲了当悔,高級(jí)一點(diǎn)的對(duì)UI也做了不少輪子傅瞻。下面要寫的不是UI輪子踢代,是簡(jiǎn)單的網(wǎng)絡(luò)請(qǐng)求的封裝。
一般網(wǎng)絡(luò)請(qǐng)求的封裝分為兩種:
一嗅骄、iOS原生NSURLSession以及NSURLConnection(NSURLConnection已經(jīng)被廢棄胳挎,我們就不多說(shuō)了)。NSURLSession 下面這篇講的不錯(cuò)溺森,我自認(rèn)為沒(méi)人家講的精辟慕爬,怕誤導(dǎo)讀者,故引用之屏积。
http://www.reibang.com/p/158e2a8c545e
二医窿、網(wǎng)絡(luò)請(qǐng)求封裝或者說(shuō)用的最多的 AFNetworking,也是基于iOS原生請(qǐng)求NSURLSession封裝而來(lái)的炊林。用法也很簡(jiǎn)單姥卢。但是我們的APP網(wǎng)絡(luò)請(qǐng)求很多,每次都去寫一遍請(qǐng)求頭之類過(guò)于繁瑣渣聚。下面是我自己封裝的隔显,個(gè)人認(rèn)為簡(jiǎn)單明了,便于使用饵逐。
JsonAFNetworking.h
//
// JsonAFNetworking.h
//
// Created by Admin on 2019/8/15.
// Copyright ? 2019 zhangjie. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface JsonAFNetworking : NSObject
+ (instancetype)sharedInstance;
/**
* 發(fā)送get請(qǐng)求
*
* @param URLString 請(qǐng)求的網(wǎng)址字符串
* @param parameters 請(qǐng)求的參數(shù)
* @param success 請(qǐng)求成功的回調(diào)
* @param failure 請(qǐng)求失敗的回調(diào)
*/
- (void)getWithURLString:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(id responseObject))success
failure:(void (^)(NSError *error))failure;
/**
* 發(fā)送post請(qǐng)求
*
* @param URLString 請(qǐng)求的網(wǎng)址字符串
* @param parameters 請(qǐng)求的參數(shù)
* @param success 請(qǐng)求成功的回調(diào)
* @param failure 請(qǐng)求失敗的回調(diào)
*/
- (void)postWithURLString:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(id responseObject))success
failure:(void (^)(NSError *error))failure;
@end
JsonAFNetworking.m
//
// JsonAFNetworking.m
//
// Created by Admin on 2019/8/15.
// Copyright ? 2019 zhangjie. All rights reserved.
//
#import "JsonAFNetworking.h"
#import "AFNetworking.h"
#import "MBProgressHUD+NJ.h"
@implementation JsonAFNetworking
static id _instance = nil;
+ (instancetype)sharedInstance {
return [[self alloc] init];
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
- (instancetype)init {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super init];
});
return _instance;
}
#pragma mark -- GET請(qǐng)求 --
- (void)getWithURLString:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(id))success
failure:(void (^)(NSError *))failure {
NSString *token = [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"token"]];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer.acceptableContentTypes = nil;
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"token"]) {
[manager.requestSerializer setValue:token forHTTPHeaderField:@"RUICHAOSESSIONID"];
}
[manager GET:URLString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (success) {
NSLog(@"URL ===== %@",task.originalRequest.URL);
NSLog(@" ===== %@",task.originalRequest.HTTPMethod);
NSLog(@" ===== %@",task.originalRequest.allHTTPHeaderFields);
NSLog(@"Head===== %@",task.originalRequest.allHTTPHeaderFields);
NSLog(@"Param===== %@",parameters);
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
NSLog(@"URL ===== %@",task.originalRequest.URL);
NSLog(@" ===== %@",task.originalRequest.HTTPMethod);
NSLog(@" ===== %@",task.originalRequest.allHTTPHeaderFields);
NSLog(@"Head===== %@",task.originalRequest.allHTTPHeaderFields);
NSLog(@"Param===== %@",parameters);
NSHTTPURLResponse * responses = (NSHTTPURLResponse *)task.response;
NSLog(@"%ld",(long)responses.statusCode);
if (responses.statusCode == 401) {
[MBProgressHUD hideHUD];
[self showLogin];
}else{
failure(error);
}
}
}];
}
#pragma mark -- POST請(qǐng)求 --
- (void)postWithURLString:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(id))success
failure:(void (^)(NSError *))failure {
NSString *token = [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"token"]];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer.acceptableContentTypes = nil;
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"token"]) {
[manager.requestSerializer setValue:token forHTTPHeaderField:@"RUICHAOSESSIONID"];
}
[manager POST:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (success) {
NSLog(@"URL ===== %@",task.originalRequest.URL);
NSLog(@"HTTPMethod===== %@",task.originalRequest.HTTPMethod);
NSLog(@"Head===== %@",task.originalRequest.allHTTPHeaderFields);
NSLog(@"Param===== %@",parameters);
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
NSLog(@"URL ===== %@",task.originalRequest.URL);
NSLog(@" ===== %@",task.originalRequest.HTTPMethod);
NSLog(@" ===== %@",task.originalRequest.allHTTPHeaderFields);
NSLog(@"Head===== %@",task.originalRequest.allHTTPHeaderFields);
NSLog(@"Param===== %@",parameters);
NSHTTPURLResponse * responses = (NSHTTPURLResponse *)task.response;
NSLog(@"%ld",(long)responses.statusCode);
if (responses.statusCode == 401) {
[MBProgressHUD hideHUD];
[self showLogin];
}else{
failure(error);
}
}
}];
}
//處理異地登錄
-(void)showLogin{
UIAlertController * alertController = [UIAlertController alertControllerWithTitle: nil message: @"當(dāng)前賬號(hào)在其他地方登錄" preferredStyle:UIAlertControllerStyleAlert];
//添加Button
[alertController addAction: [UIAlertAction actionWithTitle: @"重新登錄" style: UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
//處理點(diǎn)擊拍照
UIStoryboard *mainSB = [UIStoryboard storyboardWithName:@"login" bundle:nil];
UITabBarController *mian = [mainSB instantiateViewControllerWithIdentifier:@"login"];
[UIApplication sharedApplication].keyWindow.rootViewController = mian;
}]];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController: alertController animated: YES completion: nil];
}
@end
使用起來(lái)很簡(jiǎn)單括眠,打印的信息也很齊全,請(qǐng)求頭倍权,請(qǐng)求參數(shù)掷豺,請(qǐng)求地址等一目了然。