Se si sottoclassi AFHTTPSessionManager
o utilizzando direttamente una AFURLSessionManager
è possibile utilizzare il seguente metodo per impostare un blocco eseguito dopo il completamento di un compito:
/**
Sets a block to be executed as the last message related to a specific task, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didCompleteWithError:`.
@param block A block object to be executed when a session task is completed. The block has no return value, and takes three arguments: the session, the task, and any error that occurred in the process of executing the task.
*/
- (void)setTaskDidCompleteBlock:(void (^)(NSURLSession *session, NSURLSessionTask *task, NSError *error))block;
solo eseguire quello che vuoi fare per ogni attività della sessione in esso:
[self setTaskDidCompleteBlock:^(NSURLSession *session, NSURLSessionTask *task, NSError *error) {
if ([task.response isKindOfClass:[NSHTTPURLResponse class]]) {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)task.response;
if (httpResponse.statusCode == 500) {
}
}
}];
EDIT: Infatti, se è necessario gestire un errore restituito nell'oggetto risposta, il metodo sopra non eseguirà il lavoro. Un modo se si sta sottoclasse AFHTTPSessionManager
potrebbe essere quella di sottoclasse e impostare un serializzatore di risposta personalizzato con il suo responseObjectForResponse:data:error:
sovraccarico del genere:
@interface MyJSONResponseSerializer : AFJSONResponseSerializer
@end
@implementation MyJSONResponseSerializer
#pragma mark - AFURLResponseSerialization
- (id)responseObjectForResponse:(NSURLResponse *)response
data:(NSData *)data
error:(NSError *__autoreleasing *)error
{
id responseObject = [super responseObjectForResponse:response data:data error:error];
if ([responseObject isKindOfClass:[NSDictionary class]]
&& /* .. check for status or error fields .. */)
{
// Handle error globally here
}
return responseObject;
}
@end
e metterlo nel vostro AFHTTPSessionManager
sottoclasse:
@interface MyAPIClient : AFHTTPSessionManager
+ (instancetype)sharedClient;
@end
@implementation MyAPIClient
+ (instancetype)sharedClient {
static MyAPIClient *_sharedClient = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedClient = [[MyAPIClient alloc] initWithBaseURL:[NSURL URLWithString:MyAPIBaseURLString]];
_sharedClient.responseSerializer = [MyJSONResponseSerializer serializer];
});
return _sharedClient;
}
@end
Non ho pensato alle notifiche: molto meglio e meno invadente della personalizzazione dell'accodamento delle richieste. Molte grazie! Per quanto riguarda il blocco challenge di autenticazione: in realtà sto usando l'autenticazione token piuttosto che l'autenticazione di base, quindi immagino che non funzionerà, giusto? Ci scusiamo per averti ingannato menzionando 401. Domanda bonus: quale sarebbe il codice di risposta corretto per "token non valido"? 400? –
Non sono sicuro di quale sia il codice di risposta corretto per "token non valido". Forse il 403 è più appropriato. – Felix
AFAIK 403 è più per l'autorizzazione * non riuscita * piuttosto che per l'autenticazione ("autenticazione riuscita (se presente), ma non è consentito farlo"). Ma non importa, questa è un'altra domanda. Grazie ancora per il vostro aiuto. –