casatwy / CTNetworking

iOS networking API layer
Other
488 stars 104 forks source link

求教一个有关interceptor的问题 #9

Closed xia0peng closed 6 years ago

xia0peng commented 6 years ago

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里面?。。。。。求解这个拦截器

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

casatwy commented 6 years ago

你这里派生类和新类的概念是怎么区分的?

casatwy commented 6 years ago

而且哪来的YDLAPIManagerInterceptor协议啊?

xia0peng commented 6 years ago

sorry 上面的问题我描述的不清楚,后来我明白了,但是有个新的问题

原文:拦截器的功能可以由子类通过继承实现,也可以由其它对象实现,两种做法可以共存 当两种情况共存的时候,子类重载的方法一定要调用一下super 然后它们的调用顺序是BaseManager会先调用子类重载的实现,再调用外部interceptor的实现

问题:我测试结果:调用顺序是先调用代理实现的interceptor(外部),再调用子类重载的实现。。

是我在实现interceptor的时候哪里有问题吗?一直很疑惑和您描述的结果不一致

casatwy commented 6 years ago

我没有规定内部、外部拦截器调用的先后顺序,因为这个实现涉及不同公司的业务。

所以这个顺序取决于你何时调用super。

super在前就先调用内部拦截器,super在后就先调用外部拦截器。

xia0peng commented 6 years ago

明白了,非常感谢^_^。

前辈,我大概快两年经验,想往iOS更深的层数学习(比如底层、架构),但是现在好像遇到瓶颈了,不知该学什么,学哪方面,怎么学。有什么书籍推荐,求前辈指点一二^_^。