Code Monkey home page Code Monkey logo

ctnetworking's People

Contributors

casatwy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ctnetworking's Issues

可以加一个completionQueue吗

代理回调的地方,因为网络请求回来的数据,需要进行大量耗时的操作,可否像AF一样,做一个completionQueue属性?

请教一下 CTAPIBaseManager 中 - (void)failedOnCallingAPI: withErrorType: 的实现问题

  • (void)failedOnCallingAPI:(CTURLResponse *)response withErrorType:(CTAPIManagerErrorType)errorType
    {
    self.isLoading = NO;
    if (response) {
    self.response = response;
    }
    self.errorType = errorType;
    [self removeRequestIdWithRequestID:response.requestId];

      // user token 无效,重新登录
      if (errorType == CTAPIManagerErrorTypeNeedLogin) {
          [[NSNotificationCenter defaultCenter] postNotificationName:kCTUserTokenIllegalNotification
                                                              object:nil
                                                            userInfo:@{
                                                                       kCTUserTokenNotificationUserInfoKeyManagerToContinue:self
                                                                       }];
          return;
      }
    
      NSString *resCode = [NSString stringWithFormat:@"%@", response.content[@"resCode"]];
      if ([resCode isEqualToString:@"00100009"]
          || [resCode isEqualToString:@"05111001"]
          || [resCode isEqualToString:@"05111002"]
          || [resCode isEqualToString:@"1080002"]
          ) {
          [[NSNotificationCenter defaultCenter] postNotificationName:kCTUserTokenIllegalNotification
                                                              object:nil
                                                            userInfo:@{
                                                                       kCTUserTokenNotificationUserInfoKeyManagerToContinue:self
                                                                       }];
          return;
      }
    

    // 可以自动处理的错误
    if (errorType == CTAPIManagerErrorTypeNeedAccessToken) {
    [[NSNotificationCenter defaultCenter] postNotificationName:kCTUserTokenInvalidNotification
    object:nil
    userInfo:@{
    kCTUserTokenNotificationUserInfoKeyManagerToContinue:self
    }];
    return;
    }

    NSString *errorCode = [NSString stringWithFormat:@"%@", response.content[@"errorCode"]];
    if ([response.content[@"errorMsg"] isEqualToString:@"invalid token"]
    || [response.content[@"errorMsg"] isEqualToString:@"access_token is required"]
    || [errorCode isEqualToString:@"BL10015"]
    ) {
    // token 失效
    [[NSNotificationCenter defaultCenter] postNotificationName:kCTUserTokenInvalidNotification
    object:nil
    userInfo:@{
    kCTUserTokenNotificationUserInfoKeyManagerToContinue:self
    }];
    return;
    }

    // 常规错误
    if (errorType == CTAPIManagerErrorTypeNoNetWork) {
    self.errorMessage = @"无网络连接,请检查网络";
    }
    if (errorType == CTAPIManagerErrorTypeTimeout) {
    self.errorMessage = @"请求超时";
    }
    if (errorType == CTAPIManagerErrorTypeCanceled) {
    self.errorMessage = @"您已取消";
    }
    if (errorType == CTAPIManagerErrorTypeDownGrade) {
    self.errorMessage = @"网络拥塞";
    }

    // 其他错误
    dispatch_async(dispatch_get_main_queue(), ^{
    if ([self.interceptor respondsToSelector:@selector(manager:didReceiveResponse:)]) {
    [self.interceptor manager:self didReceiveResponse:response];
    }
    if ([self beforePerformFailWithResponse:response]) {
    [self.delegate managerCallAPIDidFailed:self];
    }
    if (self.failBlock) {
    self.failBlock(self);
    }
    [self afterPerformFailWithResponse:response];
    });
    }


这段代码的编排在 issues 中显示有点奇怪, 望体谅;

Casatwy 大大, 我的疑问是 :
1.该方法中涉及到的 resCode, errorMsg 等 key 的判断是否是业务相关的数据?
2.如果是业务相关数据, 是否可以想 Target_CTAppContext 类似的方式来引入, 实现业务数据的分离?

关于请求结果的磁盘缓存

使用NSUserDefaults.standardUserDefaults来存储缓存数据个人觉得不合理. 由于请求数据可能很大, 比如一个很长的列表, 一旦数据量累计, 不仅速度堪忧, 而且会影响到其他使用standardUserDefaults的模块. 退一步说, 即使要使用NSUserDefaults, 也应该是创建一个独占的NSUserDefaults.

求教一个有关interceptor的问题

if ((NSInteger)self != (NSInteger)self.interceptor && [self.interceptor respondsToSelector:@selector(manager:shouldCallAPIWithParams:)]) {
return [self.interceptor manager:self shouldCallAPIWithParams:params];
} else {
return YES;
}
大佬,APIManager的派生类遵循了YDLAPIManagerInterceptor协议 也设置了self.interceptor = self; 为什么派生类里面实现的协议方法总是走不到。 是不是你上面这个判断错误了啊?应该是等于:NSInteger)self == (NSInteger)self.interceptor,如果不等于永远走的都是else里面?。。。。。求解这个拦截器

我好像明白了,是要新类继承实现。那具体怎么做呢,求教大佬解答

最新版本的代码逻辑不通

CTApiProxy中
NSDictionary *result = [request.service resultWithResponseObject:responseObject response:response request:request error:&error];
如果上面返回的error是nil,对error取地址的话是有值的
接下来Demoservice中,提前返回了,造成请求成功时kCTApiProxyValidateResultKeyResponseObject里面的值为空,后面的请求结果拿不到值

`- (NSDictionary *)resultWithResponseObject:(id)responseObject response:(NSURLResponse *)response request:(NSURLRequest *)request error:(NSError **)error
{
NSMutableDictionary *result = [[NSMutableDictionary alloc] init];
if (error || !responseObject) {
return result;
}

if ([responseObject isKindOfClass:[NSData class]]) {
    result[kCTApiProxyValidateResultKeyResponseString] = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    result[kCTApiProxyValidateResultKeyResponseObject] = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:NULL];
} else {
    //这里的kCTApiProxyValidateResultKeyResponseString是用作打印日志用的,实际使用时可以把实际类型的对象转换成string用于日志打印

// result[kCTApiProxyValidateResultKeyResponseString] = responseObject;
result[kCTApiProxyValidateResultKeyResponseObject] = responseObject;
}

return result;

}`

既然error是用于判断的,就不要写成 error:(NSError **)error这种形式,建议修改如下

NSDictionary *result = [request.service resultWithResponseObject:responseObject response:response request:request error:error];
- (NSDictionary *)resultWithResponseObject:(id)responseObject response:(NSURLResponse *)response request:(NSURLRequest *)request error:(NSError *)error

崩溃

APP的网络请求用的这个库,后台有一些崩溃日志是这个库里面的崩溃,崩在这个位置:
截屏2022-01-26 下午2 07 50

怀疑是dispatchTable这个字典的访问没有加锁,多线程访问的情况下出现了崩溃

无法测试网络请求数据缓存

在进行网络请求用例测试时,发现无法进行缓存,打印日志查看最终定位到CTResponse初始化的时候
self.acturlRequestParams = request.actualRequestParams;
self.originRequestParams = request.originRequestParams;
这俩个方法的数据都是nil,不知道是方法错误还是是买问题,希望可以解释一下,谢谢

返回数据格式问题

casa大神,你好,我想请教一个问题,后台返回格式是json格式,但是我在断点调试的时候CTApiProxy.m这个类中的接收数据是直接用data接收的,这样导致进入日志CTLogger类中的时候就会崩溃,请问是需要设置什么么

一个比较难受的需求

有这样一个需求,App 大量的请求需要依赖一个 ticket。
对这个 ticket 的设计是 30 分钟时效,要客户端自己做时间戳判断,过期就要先请求 ticket,再发本来的请求。
这样我无论如何都想不到比较优雅的方法在底层处理,不知大神有没有想法。

增加功能

CTNetworking 能不能提供批量请求的API

有关缓存、日志打印与公共参数的问题

casa你好,首先非常感谢你提供这么灵活优雅的网络框架。
我在使用过程中遇到以下疑惑,还请指导:

  1. 在设置cachePolicy之后,还需要在Service中,设置新生成的request的originRequestParams和actualRequestParams,不太理解两个参数的具体含义,应该分别传什么参数,传哪里来的参数;
  2. CTLogger能否提供定制化日志打印的接口呢?方便使用pod接入CTNetworking的开发者定制化自己的log,目前我是通过分类来重写CTLogger中的方法,这样XCode会有警告:Category is implementing a method which will also be implemented by its primary class;
  3. CTURLResponse中,actualRequestParams拼成了acturlRequestParams;
  4. CTLogger中,缓存响应时打印了response.originRequestParams和response.acturlRequestParams,但是缓存CTURLResponse时只保存了content,所以这两个值永远打印为空;
  5. CTLogger中NSLog打印过长的字符串会显示不完整;
  6. 目前工作中不同业务会有不同的服务,但是会有相同的鉴权方式,那这些鉴权用的公共参数在哪里传比较好呢?我目前的做法是像CTAPIBaseManager封装一个BaseService,处理一些公共逻辑和传入公共参数,然后不同的业务派生不同的Service,是否有更好的处理方法呢?

谢谢!

Json参数请求

框架只有Form表单的请求方式,入参必须是字典,请问如何优雅的扩展JSON MULTIPART的请求方式

CTAPIBaseManager 这个类 每次发送请求都要写一个子类继承它吗

比如一个控制器里面需要发送两次请求,需要写两个子类分别继承CTAPIBaseManager,然后再分别在子类中实现代理方法 (NSString *_Nonnull)methodName 等等吗?如果这样的话 感觉挺麻烦的,可不可以写一个CTAPIBaseManager子类 然后在代理方法中加参数,区分是哪个请求,再返回对应请求的methodName值.期待你的回复

Can upload image or files ?

I test CTNetworking ,it may not support upload image files ? is't it ?
or how can I do to support upload images ?thanks!

可否提供类图?

您好, 可否提供类图?
这样有利于更快速的理解项目中类之间的逻辑关系.

这个项目是不是缺少了一些组件?

我看过PPT了,PPT中提到的组件,例如AIFService,AIFRequestGenerator,我在这个项目中并未找到,作者可以将完整的网络层源码发一份给我么?谢谢O(∩_∩)O

AFHTTPSessionManager的使用

AFHTTPSessionManager manager 不是单例,请求成功task没有收回,看到AF提问区有人回答需要调用 AFHTTPSessionManager 的 invalidateSessionCancelingTasks:resetSession: ,CTNetworking中并没有暴露AFHTTPSessionManager,所以是否需要在收到resultWithResponseObject:response:request:error:之前invalidateSessionCancelingTasks:resetSession:

CTAPIBaseManager对象的dealloc调用问题

当viewController死亡后,CTAPIBaseManager的dealloc并没有如期调用,需要等到请求完毕时,才会调用。
下面代码的闭包对CTAPIBaseManager对象进行了强引用,所以没有如期死亡。这也跟旧框架RTNetworking代码不同,现在是这样设计的吗?

CTNetworking代码:
NSNumber *requestId = [[CTApiProxy sharedInstance] callApiWithRequest:request success:^(CTURLResponse *response) {
[self successedOnCallingAPI:response];
} fail:^(CTURLResponse *response) {
CTAPIManagerErrorType errorType = CTAPIManagerErrorTypeDefault;
if (response.status == CTURLResponseStatusErrorCancel) {
errorType = CTAPIManagerErrorTypeCanceled;
}
if (response.status == CTURLResponseStatusErrorTimeout) {
errorType = CTAPIManagerErrorTypeTimeout;
}
if (response.status == CTURLResponseStatusErrorNoNetwork) {
errorType = CTAPIManagerErrorTypeNoNetWork;
}
[self failedOnCallingAPI:response withErrorType:errorType];
}];

RTNetworking代码:
#define AXCallAPI(REQUEST_METHOD, REQUEST_ID)
{
__weak typeof(self) weakSelf = self;
REQUEST_ID = [[CTApiProxy sharedInstance] call##REQUEST_METHOD##WithParams:apiParams serviceIdentifier:self.child.serviceType methodName:self.child.methodName success:^(CTURLResponse *response) {
__strong typeof(weakSelf) strongSelf = weakSelf;
[strongSelf successedOnCallingAPI:response];
} fail:^(CTURLResponse *response) {
__strong typeof(weakSelf) strongSelf = weakSelf;
[strongSelf failedOnCallingAPI:response withErrorType:CTAPIManagerErrorTypeDefault];
}];
[self.requestIdList addObject:@(REQUEST_ID)];
}

不能缓存没有参数的API请求吗?

- (void)saveMemoryCacheWithResponse:(CTURLResponse *)response serviceIdentifier:(NSString *)serviceIdentifier methodName:(NSString *)methodName cacheTime:(NSTimeInterval)cacheTime { if (response.originRequestParams && response.content && serviceIdentifier && methodName) { [self.memoryCacheCenter saveCacheWithResponse:response key:[self keyWithServiceIdentifier:serviceIdentifier methodName:methodName requestParams:response.originRequestParams] cacheTime:cacheTime]; } }
请求没有参数时,originRequestParams为空就没办法缓存了。处于什么考虑呢?

使用中的几点疑惑

求大神指教:GET /topics/:id.json 类似这种的接口,CTNetworking里要怎么写呢?
还有就是response里的content有时不一定是字典可能是数组,这个要怎么处理好呢我现在是强转了

日志打印body为N/A

  • (id)CT_defaultValue:(id)defaultData
    {
    if (![defaultData isKindOfClass:[self class]]) {
    //此处判断由于defaultData为__NSCFConstantString
    //self为NSTaggedPointerString,由于类型不同,导致不能准确打印参数
    return defaultData;
    }

    if ([self CT_isEmptyObject]) {
    return defaultData;
    }

    return self;
    }

大神,你的博客访问不了了

iOS应用架构谈,年前拜读了两篇文章,反复看了好几遍,包括评论部分,有茅塞顿开的感觉,年后再看,就访问不了了。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.