NSURLSession-Delegierung: Wie implementiere ich meine benutzerdefinierte SessionDelegate-Klasse entsprechend?

Ich habe eine Singleton-Klasse, den sogenannten RequestManager, der Anforderungen von verschiedenen Modulen und Hintergrundaufgaben meiner Anwendung verarbeiten soll.

@interface RequestFactory : NSObject

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

@end

Dann bekam ich eine weitere Klasse, SessionDelegate, die alle Rückrufe während der Anfrage behandeln soll.

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

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

@end

Meine Idee ist es, die Funktionen in diesen Klassen zu kapseln, um meine Klassen nicht zu überladen, da ich mit CommonCrypto und so weiter viele Hilfsklassen benötige.

Also habe ich schnell ein Protokoll RequestFactoryDelegate festgelegt, um die empfangenen Daten an den Absender zu senden, der die Ursprungsanforderung initiiert hat.

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

Nun, es funktioniert, wenn ich ein Objekt habe. Nennen wir es senderA, das die Anforderungen sendet, da der festgelegte Delegat immer senderA selbst ist.

Das Problem tritt bei einem anderen Objekt auf, z. senderB, der Anfragen sendet - nicht einmal zur gleichen Zeit - aber sehr kurz nach senderA send.

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

Da die Anforderung von senderA noch nicht abgeschlossen ist, setzt senderB den Delegaten auf ihn und die Delegatenfunktion von senderB wird zweimal ausgeführt.

 <senderB>
 <senderB>

Nun ... Ich muss wirklich einen eigenen benutzerdefinierten Delegaten implementieren (ob in derselben Klasse wie die RequestFactory oder nicht), aber wie gehe ich mit den Rückrufmethoden um, damit ich ordnungsgemäß auf SenderA oder SenderB antworten kann?

Meine letzte Idee ist, die NSURLSessionTasks-Klasse zu überschreiben und eine eigene Delegate-Eigenschaft oder Block-Eigenschaft oder was auch immer zu implementieren.

Vielen Dank im Voraus.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage