일부 컨텍스트를 제공하려면 : 인증 오류 (토큰 인증을 사용하지 않고 기본)를 사용하여 전역 오류 처리기를 구현하려고합니다. 원래 실패한 요청 (내 앞의 질문을 참조하십시오 AFNetworking: Handle error globally and repeat request) :AFNetworking : 작업을 다시 시도 할 때 완료 핸들러에 액세스
- (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?
}
];
}
}
(인증이 성공하면) 현재의 접근 방식은 재 인증을 수행하고, AFNetworkingOperationDidFinishNotification
에 대한 관찰자를 등록하는 것입니다
를 원래 요청을 반복 그러나, 나는 완성 블록에 관한 몇 가지 문제를 발견했다. 요청 작업 :
원래 요청을 반복 할 때 분명히 완성 블록이 실행되기를 원합니다. 그러나
AFHTTPRequestOperation
는AFURLConnectionOperation
상태의 문서로 전달 된 성공과 실패 블록에 대한 참조 (setCompletionBlockWithSuccess:failure:
참조) 및 복사NSOperation
의completionBlock
아마 좋은 생각이 아니다를 유지하지 않습니다동작 사본
completionBlock
에 포함되지 않습니다 .completionBlock
은 종종self
에 대한 참조를 강력하게 캡처합니다. 복사 할 경우 놀랍게도 작동을 가리 킵니다.재 인증에 실패하면 원래 요청의 실패 블록을 호출하고 싶습니다. 그래서, 다시, 나는 이것에 직접 접근 할 필요가있다.
여기에 뭔가가 빠졌습니까? 대체 접근법에 대한 아이디어가 있습니까? 기능 요청을 제출해야합니까?
기능 요청을 제출하는 것이 좋습니다. 또한 oauth 새로 고침으로이 문제에 봉착했습니다. – shawnwall
기능 요청을 제출했습니다 : https://github.com/AFNetworking/AFNetworking/issues/596. 나는 오늘이나 내일 후에 나 자신의 손을 잡을지도 모른다. –