Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
YogurtBiu opened this issue May 24, 2019 · 4 comments
Open

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

YogurtBiu opened this issue May 24, 2019 · 4 comments

Comments

@YogurtBiu
Copy link

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,是否有更好的处理方法呢?

谢谢!

@YogurtBiu
Copy link
Author

目前发现另一个问题。需求是利用一个轻量接口校验启动广告是否有效,首先发起请求,并阻塞主线程,如果请求成功则根据数据回到主线程继续做逻辑处理(展示上次启动App时预加载的广告页面等);如果1.5s内接口没有完成响应,则回到主线程取消请求继续做逻辑处理(跳过广告展示进入首页等);

dispatch_semaphore_t sema = dispatch_semaphore_create(0);
[XXXAPIManager loadDataWithParams:XXX success:^(CTAPIBaseManager * _Nonnull apiManager) {
    //do something
    dispatch_semaphore_signal(sema);
} fail:^(CTAPIBaseManager * _Nonnull apiManager) {
    //do something
    dispatch_semaphore_signal(sema);
}];
dispatch_semaphore_wait(sema, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)));
[[XXXAPIManager new] cancelAllRequests]; //取消请求
//do something

但是CTAPIBaseManager.m中以下代码因为在dispatch_get_main_queue()中回调,会导致上述代码主线程堵塞:

if ([self beforePerformSuccessWithResponse:response]) {
    dispatch_async(dispatch_get_main_queue(), ^{
        if ([self.delegate respondsToSelector:@selector(managerCallAPIDidSuccess:)]) {
            [self.delegate managerCallAPIDidSuccess:self];
        }
        if (self.successBlock) {
            self.successBlock(self);
        }
    });
}

不知是否能提供接口供开发者在自己所需线程回调呢?

@casatwy
Copy link
Owner

casatwy commented Jun 12, 2019

嗯,这个dispatch确实没什么必要,可以直接删掉。具体的dispatch的事情其实可以放在delegate的实现里面去做。

@casatwy
Copy link
Owner

casatwy commented Jun 12, 2019

1问题和6问题其实是一样的。

origin参数不带验证参数,actual参数就是在service中给origin添加了验证逻辑的参数。

验证逻辑应该以tool的方式给到,也就是说以组合的方式给到,而不应该是继承。

@YogurtBiu
Copy link
Author

感谢casa的回复,CTNetworking非常灵活与强大,设计的时候可能留下很多供开发者奇思妙想的地方,但是有时候缺乏指引而错过这些巧妙之处毕竟可惜,非常期待TODO中的系列Demo。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants