Delegacja NSURLSession: Jak zaimplementować odpowiednio moją niestandardową klasę SessionDelegate?

Mam klasę singleton, tzw. RequestManager, która obsługuje żądania złożone przez różne moduły i zadania w tle mojej aplikacji.

@interface RequestFactory : NSObject

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

@end

Następnie dostałem inną klasę, tak zwaną SessionDelegate, która będzie obsługiwać wszystkie wywołania zwrotne podczas żądania.

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

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

@end

Moim pomysłem jest hermetyzacja funkcji w tych klasach, aby nie przeciążać moich klas, ponieważ potrzebuję wielu klas pomocniczych z CommonCrypto i tak dalej.

Ustawiłem więc szybko zakodowany protokół RequestFactoryDelegate, aby wysłać odebrane dane do nadawcy, który zainicjował żądanie pochodzenia.

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

Cóż, działa, jeśli mam obiekt, nazwijmy go senderA, który wysyła żądania, ponieważ delegat zestawu jest zawsze sam nadawca.

Występuje problem z innym obiektem, np. senderB, który wysyła żądania - nawet w tym samym czasie - ale bardzo krótko po wysłaniu przez nadawcę.

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

Ponieważ żądanie nadawcy jest nadal w toku, nadawca ustawia go na delegata, a funkcja delegowania nadawcy jest uruchamiana dwukrotnie.

 <senderB>
 <senderB>

Cóż ... Naprawdę muszę zaimplementować własny niestandardowy delegat (niezależnie od tego, czy znajduje się w tej samej klasie, co RequestFactory, czy nie), ale jak mam obsługiwać metody wywołania zwrotnego, aby móc prawidłowo odpowiadać na senderA lub senderB?

Moim ostatnim pomysłem jest zastąpienie klasy NSURLSessionTasks i zaimplementowanie własnej właściwości delegowania lub właściwości blokowania lub cokolwiek innego.

Z góry bardzo dziękuję.

questionAnswers(3)

yourAnswerToTheQuestion