网络层方法封装2
- 为了便于进行请求的管理,特地对之前的网络层方法封装加以改进,为了就是避免请求发送出去之后就管理不了的问题。
- 其中最为重要的就是请求的取消
当一个页面的请求正在天上飞的时候,用户等了好久不耐烦了,小手点了个back,然后ViewController被pop被回收。此时请求的着陆点就没了。这是很危险的情况,着陆点要是没了,就很容易crash的。-Casa
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; }
|
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; }
|