Delegación de NSURLSession: ¿Cómo implementar mi clase SessionDelegate personalizada en consecuencia?

Obtuve una clase singleton, llamada RequestManager, que manejará las solicitudes realizadas por diferentes módulos y tareas de fondo de mi aplicación.

@interface RequestFactory : NSObject

- (void)requestDataWith:(NSString *)token
                     id:(NSString *)id
                 sender:(id<RequestFactoryDelegate>)sender;
...

@end

Luego obtuve otra clase, llamada SessionDelegate, que manejará todas las devoluciones de llamada durante la solicitud.

@interface SessionDelegate : NSObject <NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate>

@property (weak, nonatomic) id <RequestFactoryDelegate> delegate;

@end

Mi idea es encapsular las funciones en estas clases para no sobrecargar mis clases, porque necesito muchas clases de ayuda con CommonCrypto y así sucesivamente.

Así que configuré rápidamente un protocolo RequestFactoryDelegate para enviar los datos recibidos al remitente que inició la solicitud de origen.

- (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];
}

Bueno, funciona si tengo un objeto, llamémoslo senderA que envía las solicitudes, porque el delegado de conjunto siempre es senderA.

El problema ocurre al tener otro objeto, por ej. senderB, que envía solicitudes, ni siquiera al mismo tiempo, sino poco después del envío de un remitente.

- (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
 }

Debido a que la solicitud de senderA aún está en curso, senderB le asigna el delegado y lo que sucede es que la función de delegado de senderB se ejecuta dos veces.

 <senderB>
 <senderB>

Bueno ... realmente necesito implementar un delegado personalizado propio (esté o no en la misma clase que RequestFactory o no), pero ¿cómo puedo manejar los métodos de devolución de llamada para que pueda responder correctamente al remitente A o al remitenteB?

Mi última idea es anular la clase NSURLSessionTasks e implementar una propiedad de delegado propia o una propiedad de bloque o lo que sea.

Muchas gracias de antemano.

Respuestas a la pregunta(3)

Su respuesta a la pregunta