いくつかのコンテキストを提供するには: 認証エラー (基本ではなくトークン認証を使用) 用のグローバル エラーハンドラーを実装しようとしています。グローバルにエラーが発生し、リクエストを繰り返します)
AFNetworkingOperationDidFinishNotification
現在のアプローチは、再認証を行い、(認証が成功した場合) 元の要求を繰り返すためのオブザーバーを登録することです。
- (void)operationDidFinish:(NSNotification *)notification
{
AFHTTPRequestOperation *operation = (AFHTTPRequestOperation *)[notification object];
if(![operation isKindOfClass:[AFHTTPRequestOperation class]]) {
return;
}
if(403 == [operation.response statusCode]) {
// try to re-authenticate and repeat the original request
[[UserManager sharedUserManager] authenticateWithCredentials...
success:^{
// repeat original request
// AFHTTPRequestOperation *newOperation = [operation copy]; // copies too much stuff, eg. response (although the docs suggest otherwise)
AFHTTPRequestOperation *newOperation = [[AFHTTPRequestOperation alloc] initWithRequest:operation.request];
// PROBLEM 1: newOperation has no completion blocks. How to use the original success/failure blocks here?
[self enqueueHTTPRequestOperation:newOperation];
}
failure:^(NSError *error) {
// PROBLEM 2: How to invoke failure block of original operation?
}
];
}
}
ただし、リクエスト操作の完了ブロックに関するいくつかの問題に遭遇しました。
元のリクエストを繰り返すとき、その完了ブロックを実行したいのは明らかです。ただし、
AFHTTPRequestOperation
は渡された成功ブロックと失敗ブロックへの参照を保持しません ( 「」を参照setCompletionBlockWithSuccess:failure:
) 。NSOperation
completionBlock
AFURLConnectionOperation
オペレーション コピーには含まれません
completionBlock
。completionBlock
多くの場合、 への参照を強力にキャプチャします。これは、おそらく驚くべきことに、コピーされたときに元のself
操作を指すことになります。再認証が失敗した場合に備えて、元のリクエストの失敗ブロックを呼び出したいと思います。繰り返しになりますが、これに直接アクセスする必要があります。
ここで何か不足していますか?代替アプローチのアイデアはありますか? 機能リクエストを提出する必要がありますか?