casatwy / CTNetworking

iOS networking API layer
Other
488 stars 104 forks source link

token过期重新换取token后reloadData的支持 #13

Closed Vincentzzg closed 6 years ago

Vincentzzg commented 6 years ago

框架中对token过期或者非法的情况有处理,而且发出了一个通知,通知将当前API作为参数带出 [[NSNotificationCenter defaultCenter] postNotificationName:kCTUserTokenIllegalNotification object:nil userInfo:@{ kCTUserTokenNotificationUserInfoKeyManagerToContinue:self }];

kCTUserTokenNotificationUserInfoKeyManagerToContinue看参数的命名字可知是token更换后,可以重新发起之前的请求的意思,但是这里拿到的self其实无法完全满足重发的需求。

如果当前API是使用loadData方法发起的,在通知接收方法中取到API实例重新loadData就可以了。但是如果当前API的发起是通过类方法+ (NSInteger)loadDataWithParams:(NSDictionary * _Nullable)params success发起的,像重新发起的时候就会发现缺少params,当前API实例也没有保存params,所以这种情况下无法在脱离当时的业务场景的情况下独立重新发起请求。

所以我尝试着做了一些修改,试图解决这个问题,以完善框架对重新发起请求的支持,你看下是否可行

casatwy commented 6 years ago

我现在人在印尼😂

发自我的 iPhone

在 2018年7月16日,15:17,zzg notifications@github.com<mailto:notifications@github.com> 写道:

框架中对token过期或者非法的情况有处理,而且发出了一个通知,通知将当前API作为参数带出 [[NSNotificationCenter defaultCenter] postNotificationName:kCTUserTokenIllegalNotification object:nil userInfo:@{ kCTUserTokenNotificationUserInfoKeyManagerToContinue:self }];

kCTUserTokenNotificationUserInfoKeyManagerToContinue看参数的命名字可知是token更换后,可以重新发起之前的请求的意思,但是这里拿到的self其实无法完全满足重发的需求。

如果当前API是使用loadData方法发起的,在通知接收方法中取到API实例重新loadData就可以了。但是如果当前API的发起是通过类方法+ (NSInteger)loadDataWithParams:(NSDictionary * _Nullable)params success发起的,像重新发起的时候就会发现缺少params,当前API实例也没有保存params,所以这种情况下无法在脱离当时的业务场景的情况下独立重新发起请求。

所以我尝试着做了一些修改,试图解决这个问题,以完善框架对重新发起请求的支持,你看下是否可行


You can view, comment on, or merge this pull request online at:

https://github.com/casatwy/CTNetworking/pull/13

Commit Summary

File Changes

Patch Links:

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHubhttps://github.com/casatwy/CTNetworking/pull/13, or mute the threadhttps://github.com/notifications/unsubscribe-auth/AA9Y1SB610nsCpKQdbLvHY8sSv4828x4ks5uHD4IgaJpZM4VQqNg.

casatwy commented 6 years ago

我确实是不支持在类方法调度API的前提下,登陆态API的无感调度的。

在你的改法中,你默认了上次挂起的请求与获得token之后重新发起的请求这两个请求参数是一样的。但实际上不是。

获得登陆态之后准备发起旧请求时,参数是有可能需要额外增加,或者原参数是有修改的。那么在这种情况下,应当去找paramSource生产最新的参数。而类方法调用的API是没有paramSource的,所以无法保证你上次存下来的参数这次也能用。

这就是我不实现类方法登陆态API也能够无感调度的原因

Vincentzzg commented 6 years ago

明白 不过类方法用起来好方便,很多请求都用的类方法,这样的话就没法实现用户无感的重新发起请求

其实对于业务请求获取登录态前后几乎没有需要修改参数的需求,获取登录态前后变的是token,token一般放在request的header里,这个值会在重新发起请求的生成request的时候重新设置

按照我这种情况,参数不变,获取登录态之后需要重新发起请求,看来只能在自己的请求基类里面做一些支持了

casatwy commented 6 years ago

不一定的,有的时候还会要求额外再带用户level等参数