casatwy / CTNetworking

iOS networking API layer
Other
488 stars 104 forks source link

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

Open YogurtBiu opened 5 years ago

YogurtBiu commented 5 years ago

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 commented 5 years ago

目前发现另一个问题。需求是利用一个轻量接口校验启动广告是否有效,首先发起请求,并阻塞主线程,如果请求成功则根据数据回到主线程继续做逻辑处理(展示上次启动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 commented 5 years ago

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

casatwy commented 5 years ago

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

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

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

YogurtBiu commented 5 years ago

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