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.

questionAnswers(3)

yourAnswerToTheQuestion