Để cung cấp cho một số bối cảnh: Tôi đang cố gắng triển khai trình xử lý lỗi toàn cầu cho các lỗi xác thực (sử dụng xác thực mã thông báo, không cơ bản), nên cố gắng xác thực lại và sau đó lặp lại ban đầu yêu cầu không thành (xem câu hỏi trước đây của tôi: AFNetworking: Handle error globally and repeat request)AFNetworking: Truy cập vào trình xử lý hoàn tất khi thử lại hoạt động
cách tiếp cận hiện nay là phải đăng ký một người quan sát cho AFNetworkingOperationDidFinishNotification
mà không tái thẩm định và (nếu auth thành công) lặp đi lặp lại yêu cầu ban đầu:
- (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?
}
];
}
}
Tuy nhiên, tôi tình cờ gặp một số vấn đề liên quan đến các khối hoàn thành yêu cầu hoạt động:
Khi lặp lại yêu cầu ban đầu, tôi rõ ràng muốn khối hoàn thành được thực thi. Tuy nhiên,
AFHTTPRequestOperation
không giữ lại tài liệu tham khảo cho sự thành công và thất bại khối thông qua (xemsetCompletionBlockWithSuccess:failure:
) và sao chépNSOperation
'scompletionBlock
có lẽ không phải là một ý tưởng tốt, như tài liệu choAFURLConnectionOperation
trạng thái:Operation bản không bao gồm
completionBlock
.completionBlock
thường mạnh mẽ chụp một tham chiếu đếnself
, trong đó, có lẽ đáng ngạc nhiên, nếu không sẽ trỏ đến hoạt động gốc khi được sao chép.Trong trường hợp xác thực lại không thành công, tôi muốn gọi khối lỗi của yêu cầu ban đầu. Vì vậy, một lần nữa, tôi cần truy cập trực tiếp vào điều này.
Tôi có thiếu gì đó ở đây không? Bất kỳ ý tưởng cho phương pháp tiếp cận thay thế? Tôi có nên gửi yêu cầu tính năng không?
Ý tưởng tốt để gửi yêu cầu tính năng, vì tôi bị kẹt trên điều này cũng với làm mới oauth. – shawnwall
Đã gửi yêu cầu tính năng: https://github.com/AFNetworking/AFNetworking/issues/596. Tôi có thể có được bàn tay của riêng tôi về điều này sau ngày hôm nay hoặc ngày mai. –