版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.05.19 |
前言
前面写了那么多篇主要着眼于局部问题的解决,包括特定功能的实现、通用工具类的封装、视频和语音多媒体的底层和实现以及动画酷炫的实现方式等等。接下来这几篇我们就一起看一下关于iOS系统架构以及独立做一个APP的架构设计的相关问题。感兴趣的可以看上面几篇。
1. 架构之路 (一) —— iOS原生系统架构(一)
2. 架构之路 (二) —— APP架构分析(一)
3. 架构之路 (三) —— APP架构之网络层分析(一)
回顾
上一篇主要讲述了对网络层的架构分析,这一篇根据demo一起进行网络层的实现。
一种网络层的封装
下面我们就看一下一种网络层的封装。
这里需要和大家说一下:
-
JJService
是网络请求的基类。里面包含不同参数的几种GET或者POST请求。 -
JJServiceDefine
定义了一些不同页面模块用到的host,比如static NSString * const kUserHost = @"http://user.xxxxx.com";
-
JJHTTPSessionManager.h
,它继承了AFN的AFHTTPSessionManager
,提供了参数最全的GET和POST请求。 -
JJLoginService.h
,这个是JJService
的子类,专门负责登录模块的接口服务。 -
global.pch
,这个很清楚就是全局的PCH文件。
下面我们就大概的看一下每一个文件或者模块。
1. JJService.h
下面我们看一下这个基类的接口的定义。
/**
网络请求的基类
*/
@interface JJService : NSObject
@property (nonatomic, copy) NSString *host;
- (instancetype)initWithHost:(NSString *)host;
//发送Get请求到URL
- (void)getDataWithURL:(NSString *)url completion:(JJCompletionBlock)completion failure:(JJFailureBlock)failure;
//发送Get请求到host+uri
- (void)get:(NSString *)uri completion:(JJCompletionBlock)completion failure:(JJFailureBlock)failure;
- (void)get:(NSString *)uri parameters:(NSDictionary *)params completion:(JJCompletionBlock)completion failure:(JJFailureBlock)failure;
- (void)get:(NSString *)uri host:(NSString *)host parameters:(NSDictionary *)params completion:(JJCompletionBlock)completion failure:(JJFailureBlock)failure;
//发送Post请求到host+uri
- (void)post:(NSString *)uri completion:(JJCompletionBlock)completion failure:(JJFailureBlock)failure;
- (void)post:(NSString *)uri parameters:(NSDictionary *)params completion:(JJCompletionBlock)completion failure:(JJFailureBlock)failure;
- (void)post:(NSString *)uri host:(NSString *)host parameters:(NSDictionary *)params completion:(JJCompletionBlock)completion failure:(JJFailureBlock)failure;
- (void)uploadFileData:(NSData *)data uri:(NSString *)uri parameters:(NSDictionary *_Nullable )parameters completion:(JJCompletionBlock)completion failure:(JJFailureBlock)failure;
@end
这里不同的方法,最后都会调用参数最齐备的方法在.m中。
2. JJServiceDefine
里面定义了不同模块使用的host参数,比如:
#ifndef JJServiceDefine_h
#define JJServiceDefine_h
//User Host
static NSString * const kUserHost = @"http://user.xxxxx.com";
//登录host
static NSString * const kLoginHost = @"http://gh.login.com/";
#endif
3. JJHTTPSessionManager
它继承了AFHTTPSessionManager
,提供了GET/POST等请求服务。
JJHTTPSessionManager.h
#import
@interface JJHTTPSessionManager : AFHTTPSessionManager
- (nullable NSURLSessionDataTask *)JJGet:(NSString *_Nonnull)URLString
parameters:(nullable id)parameters
progress:(nullable void (^)(NSProgress * _Nullable downloadProgress))downloadProgress
success:(nullable void (^)(NSURLSessionDataTask * _Nullable task, id _Nullable responseObject))success
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError * _Nullable error))failure;
- (nullable NSURLSessionDataTask *)JJPost:(NSString *_Nonnull)URLString
parameters:(nullable id)parameters
progress:(nullable void (^)(NSProgress * _Nullable uploadProgress))uploadProgress
success:(nullable void (^)(NSURLSessionDataTask * _Nullable task, id _Nullable responseObject))success
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError * _Nullable error))failure;
@end
JJHTTPSessionManager.m
#import "JJHTTPSessionManager.h"
@implementation JJHTTPSessionManager
- (nullable NSURLSessionDataTask *)JJGet:(NSString *_Nonnull)URLString
parameters:(nullable id)parameters
progress:(nullable void (^)(NSProgress * _Nullable downloadProgress))downloadProgress
success:(nullable void (^)(NSURLSessionDataTask * _Nullable task, id _Nullable responseObject))success
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError * _Nullable error))failure
{
//设置请求头
self.requestSerializer = [AFHTTPRequestSerializer serializer];
[self.requestSerializer setValue:@"application/x-www-form-urlencoded;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
[self setRequestHeader:self.requestSerializer];
//设置数据类型
self.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/html", nil];
return [super GET:URLString parameters:parameters progress:downloadProgress success:success failure:failure];
}
- (nullable NSURLSessionDataTask *)JJPost:(NSString *_Nonnull)URLString
parameters:(nullable id)parameters
progress:(nullable void (^)(NSProgress * _Nullable uploadProgress))uploadProgress
success:(nullable void (^)(NSURLSessionDataTask * _Nullable task, id _Nullable responseObject))success
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError * _Nullable error))failure
{
//设置请求头
self.requestSerializer = [AFHTTPRequestSerializer serializer];
[self.requestSerializer setValue:@"application/x-www-form-urlencoded;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
[self setRequestHeader:self.requestSerializer];
//设置数据类型
self.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/html", nil];
return [self POST:URLString parameters:parameters progress:uploadProgress success:success failure:failure];
}
- (void)setRequestHeader:(AFHTTPRequestSerializer *)request
{
//这里设置的是请求的一些基本参数
[self.requestSerializer setValue:@"个人的userId" forHTTPHeaderField:@"userid"];
[self.requestSerializer setValue:@"token值" forHTTPHeaderField:@"token"];
}
@end
4. JJLoginService
这里是JJService
的子类,专门负责登录模块的接口服务。
#import "JJService.h"
@interface JJLoginService : JJService
//这里处理登录逻辑的网络请求
+ (instancetype)service;
//下面就是登录相关的一些接口
@end
5. global.pch
这个没什么说的,全局的PCH文件。
#ifndef global_pch
#define global_pch
//网络请求类
#import "JJService.h"
//网络请求类用来存放host
#import "JJServiceDefine.h"
#endif
这里存放的就是一些全局共享的东西,这里也不多说了。
这种网络层的好处:
通过定义基类和继承,可以使不同的业务方独立分开,处理不同的模块更清晰和明确。
需要注意block引起的retain,要weak弱化一下。
后记
本篇主要介绍了工程项目中常见的网络层的架构,来自工程实践的验证,并已经进行了脱敏处理,感兴趣的给个赞或者关注~~~~