美文网首页
基于AFN、RAC简单的网络层构建

基于AFN、RAC简单的网络层构建

作者: lmfei | 来源:发表于2019-10-27 17:36 被阅读0次

本文网络层处理,主要针对request层、task层、manager层、error层、cache层、以及数据返回处理
下面我们来详细分析各个层面我们做了什么

Request层

主要是根据请求头、请求体、请求方式、超时时间返回一个request对象

NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:urlPath parameters:params error:nil];
request.timeoutInterval = RequestTimeoutInterval;
[header enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        
    [request setValue:obj forHTTPHeaderField:key];
}];

Task层

使用AFN根据request生成一个task任务

NSString *methodType = method == LNetworkRequestTypeGET ? @"GET": @"POST";
    
NSMutableURLRequest *request =[[LURLRequest sharedInstance] requestWithURL:urlPath method:methodType params:params header:header];
    
NSNumber *taskIdentifer;
    
NSURLSessionDataTask *task = [self.sessionManager dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        
    //从task表中删除已经请求的任务
    dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
    [self.taskTable removeObjectForKey:taskIdentifer];
    dispatch_semaphore_signal(lock);
        
    !completionHandle?: completionHandle(response, responseObject, error);
}];

cache层

使用NSCache对需要缓存的请求进行处理

- (void)removeObjectForKey:(id)key {
    
    [self.cache removeObjectForKey:key];
}
- (void)setObject:(LNetworkCache *)objct forKey:(id)key {
    
    [self.cache setObject:objct forKey:key];
}
- (LNetworkCache *)objectForKey:(id)key {
    
    return [self.cache objectForKey:key];
}

error层

主要是针对一些报错信息的管理

static NSString *LNoDataErrorTip = @"没有任何报错信息”;

数据返回处理

主要是通过config中传入的取值路径、modal类进行处理

 if (config.valuePath.length > 0) {
     json = [json valueForKey:config.valuePath];
 }
    
 if ([json isKindOfClass:[NSDictionary class]]) {
     if (json) {
         //数据转模型
         result = [config.modelClass yy_modelWithJSON:json];
     }else {
         formatError = [NSError errorWithDomain:LNoDataErrorTip code:LNetworkTaskErrorNoData userInfo:nil];                                                                            }
 }

manager层

主要工作是将缓存与task进行结合
在进行task任务前,先根据是否需要缓存以及是否有缓存进行取缓存操作,以及返回报文的处理,缓存设置

NSString *cacheKey;
if (config.cacheValidTimeInterval  > 0){
    NSMutableString *mutableString = [NSMutableString stringWithString:config.url];
    NSMutableArray *paramsKeys = [config.params.allKeys mutableCopy];
    if (paramsKeys.count > 1) {
       [paramsKeys sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
            return [obj1 compare:obj2];
       }];
            
        [paramsKeys enumerateObjectsUsingBlock:^(NSString *  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            [mutableString appendFormat:@"&%@=%@", obj, config.params[obj]];
            }];
            
        cacheKey = [LHttpTool lMd5String:[mutableString copy]];
            
        LNetworkCache *cache = [[LNetworkCacheManager sharedManager]objectForKey:cacheKey];
        //查看内存中是否有
        if (!cache.isValid) {
            [[LNetworkCacheManager sharedManager] removeObjectForKey:cacheKey];
        } else {
            NSLog(@"内存有效,内存中获取数据");
            handler ? handler(cache.data, nil) : nil;
            return @(-1);
        }
    }
}

再使用RAC,对manager进行扩展

- (RACSignal *)signalTaskWithConfiguration:(LNetworkTaskConfiguration *)config {
    return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        NSNumber *taskIdentifier = [self dispatchTaskWithConfiguration:config completionHandler:^(id result, NSError *error) {
            if (error) {
                [subscriber sendError:error];
            }else {
                [subscriber sendNext:result];
                [subscriber sendCompleted];
            }
        }];
        return [RACDisposable disposableWithBlock:^{
            [self cancelTask:taskIdentifier];
        }];
    }].deliverOnMainThread;
}

使用方式

[[[LHttpManager alloc] signalTaskWithConfiguration:configuration] subscribeNext:^(id  _Nullable x) {
    NSLog(@"RAC 返回报文:%@",x);
}];

生活如此美好,今天就点到为止。。。

相关文章

网友评论

      本文标题:基于AFN、RAC简单的网络层构建

      本文链接:https://www.haomeiwen.com/subject/whhmvctx.html