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ę.