我正在使用一个NSProxy
子类并forwardInvocation:
用于捕获对我的后端 API 对象(共享实例)的调用。
一些背景信息:我想捕获 API 调用,以便每次我都可以检查是否必须刷新我的身份验证令牌。如果是,我只是在之前执行刷新。
方法参数 (of invocation
) 包含块。
一些简化的代码:
- (void)forwardInvocation:(NSInvocation *)invocation {
[invocation setTarget:self.realAPI];
[invocation retainArguments];
// Perform refresh call and forward invocation after
// successfully refreshed
if (authenticationRefreshNeeded) {
[self.realAPI refreshWithBlock:^(NSObject *someObject) {
[invocation invokeWithTarget:self.realAPI];
}];
}
// Otherwise we just forward the invocation immediately
else {
[invocation invokeWithTarget:self.realAPI];
}
return;
}
我已经在调用retainArguments
,所以我的块和其他参数不会因为invokeWithTarget:
(refreshWithBlock:
进行异步 API 调用)的延迟执行而丢失。
到目前为止一切正常 - 但是:
调用的返回值始终是在刷新块内执行nil
时。invokeWithTarget:
有没有办法保留返回值(如参数)?
有什么提示吗?建议?
更新
作为对@quellish 的回应:问题是返回值是NSURLSessionDataTask
我在调用后直接读取的类型(我用来显示活动指示器)。但是代理不会立即转发呼叫,因此返回值不存在 - 当然(我是盲目的)。什么是可能的解决方法?我可以返回占位符值吗?或者当方法被调用时我如何知道调用者,以便稍后检索返回值?