Делегация NSURLSession: Как соответственно реализовать мой пользовательский класс SessionDelegate?

Получил одноэлементный класс, так называемый RequestManager, который должен обрабатывать запросы, сделанные различными модулями, и фоновые задачи моего приложения.

@interface RequestFactory : NSObject

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

@end

Затем я получил другой класс, так называемый SessionDelegate, который будет обрабатывать все обратные вызовы во время запроса.

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

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

@end

Моя идея заключается в том, чтобы инкапсулировать функции в этих классах, чтобы не перегружать мои классы, потому что мне нужно много вспомогательных классов с CommonCrypto и так далее.

Поэтому я быстро установил код RequestFactoryDelegate для отправки полученных данных отправителю, который инициировал исходный запрос.

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

Ну, это работает, если у меня есть объект, давайте назовем его senderA, который отправляет запросы, потому что установленный делегат всегда является самим senderA.

Проблема возникает с другим объектом, например, senderB, который отправляет запросы - даже не в одно и то же время - но очень скоро после отправки senderA.

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

Поскольку запрос senderA все еще выполняется, senderB устанавливает ему делегат, и в этом случае функция делегата senderB запускается дважды.

 <senderB>
 <senderB>

Хорошо ... Мне действительно нужно реализовать собственный пользовательский делегат (независимо от того, находится ли он в том же классе, что и RequestFactory, или нет), но как мне обработать методы обратного вызова, чтобы я мог правильно реагировать на senderA или senderB?

Моя последняя идея - переопределить класс NSURLSessionTasks и реализовать собственное свойство делегата или свойство блока или что-то еще.

Спасибо заранее.

Ответы на вопрос(3)

Ваш ответ на вопрос