Arclin

Advocate Technology. Enjoy Technology.

0%

网络层方法封装2

网络层方法封装2

  • 为了便于进行请求的管理,特地对之前的网络层方法封装加以改进,为了就是避免请求发送出去之后就管理不了的问题。
  • 其中最为重要的就是请求的取消

当一个页面的请求正在天上飞的时候,用户等了好久不耐烦了,小手点了个back,然后ViewController被pop被回收。此时请求的着陆点就没了。这是很危险的情况,着陆点要是没了,就很容易crash的。-Casa

  • 另外还添加了请求头,有需求的话就调用有添加请求头的方法

  • 接下来说说改造

    1. 添加单例方法,使用 sharedTool 管理请求
    2. 改原先的类方法为实例方法,并添加 NSInteger的返回值
    3. 添加取消请求和取消全部请求的方法
    4. DKResponse 添加 taskIdentifier(NSInteger)属性
  • 声明部分

1
2
3
4
5
6
7
8
9
/** 请求头 */
@property (nonatomic,strong) NSDictionary *header;

+ (instancetype)sharedTool;

- (NSInteger)GET:(NSString *)URLString parameters:(id)parameters
responseBlock:(DKHTTPResponseBlock)block;

- (NSInteger)POST:(NSString *)URLString parameters:(id)parameters responseBlock:(DKHTTPResponseBlock)block;
  • 方法实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static DKHTTPTool *_tool;

+ (id)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_tool = [super allocWithZone:zone];
});
return _tool;
}

+ (instancetype)sharedTool
{
if (_tool == nil) {
_tool = [[DKHTTPTool alloc] init];
}
return _tool;
}
  • GET请求添加请求头
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- (NSInteger)GET:(NSString *)URLString header:(NSDictionary *)header parameters:(id)parameters responseBlock:(DKHTTPResponseBlock)block
{
AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
AFHTTPRequestSerializer *requestSerializer = mgr.requestSerializer;
[header enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
[requestSerializer setValue:obj forHTTPHeaderField:key];
}];
requestSerializer.timeoutInterval = kTimeOutInterval;
NSURLSessionTask *task = [mgr GET:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
DKResponse *resp = [DKResponse mj_objectWithKeyValues:responseObject];
resp.rawData = responseObject;
resp.taskIdentifier = task.taskIdentifier;
if(block){
block(resp);
}

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
DKResponse *resp = [[DKResponse alloc] init];
resp.error = error;
if (block) {
block(resp);
}
}];
NSNumber *requestId = @(task.taskIdentifier);
[self.dispatchTable setObject:task forKey:requestId];
return task.taskIdentifier;
}
  • 取消请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (void)cancelRequestWithRequestIds:(NSArray *)requestIds
{
for (NSInteger i = 0; i < requestIds.count ; i++) {
NSInteger requestId = [requestIds[i] integerValue];
NSURLSessionTask *task = [self.dispatchTable objectForKey:@(requestId)];
[task cancel];
[self.dispatchTable removeObjectForKey:@(requestId)];
}
}

- (void)cancelAllRequest
{
[self.dispatchTable enumerateKeysAndObjectsUsingBlock:^(NSNumber * _Nonnull key, NSURLSessionTask * _Nonnull obj, BOOL * _Nonnull stop) {
[obj cancel];
}];
}
  • 其他方法
1
2
3
4
5
6
7
8
#pragma mark - seter & getter
- (NSMutableDictionary<NSNumber *,NSURLSessionTask *> *)dispatchTable
{
if (!_dispatchTable) {
_dispatchTable = [NSMutableDictionary dictionary];
}
return _dispatchTable;
}