我使用NSProxy
子類和forwardInvocation:
捕獲對我的後端API對象(共享實例)的調用。NSProxy和forwardInvocation:調用塊內調用導致零返回值
一些背景信息: 我想捕獲API調用,所以我可以每次檢查是否需要刷新我的身份驗證令牌。如果是,我只是在之前執行刷新。
方法參數(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
類型(我用來顯示一個活動的指標),我在進行呼叫之後直接讀取。但代理不會立即轉發呼叫,所以返回值不存在 - 當然(我是盲人)。 什麼是可能的解決方法?我可以返回一個佔位符值,或者當方法被調用時我怎樣才能知道調用者,以便以後可以檢索返回值?
你可以更新與你在哪裏讀取返回值的問題?當你調用getReturnValue時,你的調用本身是否爲零? – quellish
是這樣。 Facepalm在晚上的其餘時間...任何提示我如何解決問題?或者有另一種方法來攔截執行另一個異步任務的API調用之前(無需在每個API方法中執行刷新檢查......) – orschaef