Delegação NSURLSession: Como implementar minha classe SessionDelegate personalizada de acordo?
Tenho uma classe singleton, chamada RequestManager, que deve lidar com solicitações feitas por diferentes módulos e tarefas secundárias do meu aplicativo.
@interface RequestFactory : NSObject
- (void)requestDataWith:(NSString *)token
id:(NSString *)id
sender:(id<RequestFactoryDelegate>)sender;
...
@end
Então eu tenho outra classe, chamada SessionDelegate, que deve lidar com todas as chamadas de retorno durante a solicitação.
@interface SessionDelegate : NSObject <NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate>
@property (weak, nonatomic) id <RequestFactoryDelegate> delegate;
@end
Minha idéia é encapsular as funções nessas classes para não sobrecarregar minhas classes, porque eu preciso de muitas classes auxiliares com o CommonCrypto e assim por diante.
Por isso, configurei rapidamente um protocolo RequestFactoryDelegate para enviar os dados recebidos para o remetente que iniciou a solicitação de origem.
- (void)requestDataWith:(NSString *)token
id:(NSString *)id
sender:(id<RequestFactoryDelegate>)sender
{
self.sessionDelegate.delegate = sender;
NSMutableURLRequest *request = //create the request here
NSURLSessionDataTask *dataTask = [self.defaultSession dataTaskWithRequest:request];
[dataTask resume];
}
Bem, funciona se eu tiver um objeto, vamos chamá-lo de senderA que envia as solicitações, porque o delegado set é sempre o próprio SenderA.
O problema ocorre com outro objeto, por ex. senderB que envia pedidos - nem mesmo ao mesmo tempo - mas logo após o envio de um remetente.
- (void)foo
{
[requestFactory requestDataWith:token
id:id
sender:senderA]; // let's assume this takes 20s
[requestFactory requestDataWith:token
id:id
sender:senderB]; // let's assume this takes 1s
}
Como a solicitação de senderA ainda está em andamento, senderB define o delegado para ele e o que acontece é que a função de delegação de senderB é executada duas vezes.
<senderB>
<senderB>
Bem ... Eu realmente preciso implementar um delegado personalizado próprio (ou não na mesma classe que o RequestFactory ou não), mas como lidar com os métodos de retorno de chamada para que eu possa responder corretamente ao senderA ou senderB?
Minha última idéia é substituir a classe NSURLSessionTasks e implementar uma propriedade de delegação ou propriedade de bloco própria ou o que for.
Muito obrigado antecipadamente.