Aby podać pewien kontekst: Próbuję zaimplementować globalny moduł obsługi błędów dla błędów uwierzytelniania (przy użyciu uwierzytelniania tokena, a nie podstawowego), który powinien spróbować ponownie uwierzytelnić, a następnie powtórzyć Oryginalny powiodło się żądanie (patrz mój poprzedni pytanie: AFNetworking: Handle error globally and repeat request)AFNetworking: Dostęp do procedur obsługi zakończeń podczas ponownej operacji
Obecne podejście jest zarejestrowanie obserwatora dla AFNetworkingOperationDidFinishNotification
który dokłada ponownego uwierzytelniania i (jeśli auth udało) powtarza oryginalne żądanie:
- (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?
}
];
}
}
Jednak natknąłem się na niektóre kwestie dotyczące ukończenia bloków Operacje Żądanie:
Kiedy powtarzając oryginalny wniosek, oczywiście chcę jej zakończenia bloki mają być wykonywane. Jednak
AFHTTPRequestOperation
nie zachowuje odnośniki do przekazanych sukces i porażka bloków (patrzsetCompletionBlockWithSuccess:failure:
) i kopiowanieNSOperation
„scompletionBlock
prawdopodobnie nie jest dobrym pomysłem, ponieważ dokumentacjiAFURLConnectionOperation
stanów: kopieoperacyjne nie obejmują
completionBlock
.completionBlock
często silnie przechwytuje odniesienie doself
, co, o dziwo, mogłoby wskazywać na oryginalną operację podczas kopiowania.Jeśli ponowne uwierzytelnianie nie powiedzie się, chcę wywołać blok błędu pierwotnego żądania. Więc znowu będę potrzebować bezpośredniego dostępu do tego.
Czy coś tu brakuje? Jakieś pomysły na alternatywne podejścia? Czy powinienem wysłać żądanie funkcji?
Dobry pomysł na przesłanie prośby o funkcję, ponieważ utknąłem na niej również z odświeżaniem oauth. – shawnwall
Przesłano żądanie funkcji: https://github.com/AFNetworking/AFNetworking/issues/596. Mogę wziąć to w swoje ręce później dzisiaj lub jutro. –