2017-03-29 3 views
0

Zunächst einmal, ich glaube nicht, dass diese Frage bereits vorhanden ist, aber ich stimme gibt es ähnliche Beiträge, bitte lesen Sie weiter.Abort NSURLConnection während seiner „Verbinden“ Zustand

Meine Frage ist: Wie kann ein NSURLConnection in seinem Abbruch „verbindet“ Zustand? Ich meine, nachdem die Verbindung hergestellt wurde, können wir die Methode NSUrlConnection cancel verwenden, um Anfragen abzubrechen. Aber wie wird es im "Verbindungs" -Zustand abbrechen, bevor es die Zeitüberschreitung erreicht, wenn der Server keine Antwort liefert (bevor irgendwelche Delegiertenanrufe empfangen werden)?

Danke für Ihre Zeit!

EDIT

I NSURLSession​Task statt NSUrlConnection verwenden soll, die (mit seiner Methode cancel) zu tun?

EDIT 2 - Codebeispiel

NSURLConnection* m_connection; 
m_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 
if(m_connection){ 
    [m_connection start]; 

    m_timer = [NSTimer scheduledTimerWithTimeInterval: FLT_MAX 
               target: self selector: @selector(doNothing:) 
              userInfo: nil repeats:YES]; 
    m_runLoop = [NSRunLoop currentRunLoop]; 
    [m_runLoop addTimer:m_timer forMode:NSDefaultRunLoopMode]; 
    while (m_bRunLoop && [m_runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]); 

    [m_connection cancel]; 
} 

ich meine Verbindungsdaten streamen. Wie Sie sehen können, denn jetzt abbrechen ich meine Verbindung m_bRunLoop-false Einstellung und es ist in Ordnung. Aber meine Frage ist: Wie kann ich meine Verbindung abbrechen, bevor der Server eine Antwort sendet, ohne auf den gesamten Timeout zu warten?

+0

können Sie nach dem Code, wo Sie die 'NSURLConnection' Instanzen erstellen und wo Sie sie abbrechen möchten, ist, dass in der gleichen Klasse oder verschiedenen Klassen gemacht? –

+0

Ich habe meine Post bearbeitet, andere Klasse oder das gleiche ist egal, ich kann damit umgehen. – N0un

Antwort

1

Sie können [NSURLConnection cancel] noch rufen Verbindung abbrechen und keine weiteren Delegierten Anrufe. Denken Sie daran, dass Sie ein neues Verbindungsobjekt erstellen müssen, wenn Sie die Verbindung wiederherstellen möchten. Aus Ihrer Frage folge ich eher, dass Sie ein Problem haben, wie man diesen cancel Anruf vor dem Empfangen von Delegiertenanrufen macht, ist das der Fall?

Bedenken Sie auch NSURLSession API mit Daten Aufgaben mit, da dies wahrscheinlich bessere Art in den meisten Fällen die Vernetzung zu handhaben ist.

EDIT (wie Sie hinzugefügt Code):

Zunächst einmal beachten Sie, dass ein Timer auf Ihre Laufschleife Hinzufügen nichts hier ändern NSTimer nicht als Eingangsquelle für die Laufschleife betrachtet wird (wenn du tust wirklich nichts ").

Zweitens - wenn Sie m_bRunLoop auf false setzen, tun Sie es irgendwo, obwohl Sie den Code nicht zur Verfügung gestellt - aber das ist der Ort, um Ihre Verbindung zu stornieren, so nennen wir diesen Ort "CancelConnection" -Methode.

Ändern Sie den Code wie folgt:

m_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 
if(m_connection){ 
    yourConnectionThread = [NSThread currentThread]; // store your thread in instance variable 
    [m_connection start]; 

    m_timer = [NSTimer scheduledTimerWithTimeInterval: FLT_MAX 
               target: self selector: @selector(doNothing:) 
              userInfo: nil repeats:YES]; 
    m_runLoop = [NSRunLoop currentRunLoop]; 
    [m_runLoop addTimer:m_timer forMode:NSDefaultRunLoopMode]; 

} 

und Verfahren implementieren, wo Sie Verbindung aufheben, denken Sie daran, dass Sie an einem Faden abbrechen aufrufen müssen, auf dem Sie Verbindung gestartet:

- (void)cancelConnection { 
    //m_bRunLoop = false <- this was before here 
    [m_connection performSelector:@selector(cancel) onThread:yourConnectionThread withObject:nil waitUntilDone:YES]; 

} 

Last, aber als Kommentar - denken Sie daran, dass NSRunLoop nicht threadsicher ist und Sie sollten es nicht aus verschiedenen Threads aufrufen.

+0

Ja, mein Problem ist, es abzubrechen, bevor irgendwelche Delegiertenanrufe empfangen werden, genau! – N0un

+0

Dann ist dies das Problem Ihrer Code-Architektur.Als schneller Patch können Sie alle 'NSURLConnections' speichern, die in einer 'NSDictionary'-Instanzvariablen Ihrer Klasse gestartet wurden, die Anfragen ausführt, und wenn Sie" an richtiger Stelle & Zeit "sind, um die Verbindung abzubrechen, wählen Sie eine aus dem Wörterbuch und rufen Sie an 'Abbrechen' darauf. –

+0

Nun, um über Architektur zu sprechen, habe ich eine 'NSThread', die einige Initialisierungen macht dann startet die Verbindung (für Stream-Daten verwendet), ich möchte in der Lage sein, die Verbindung jederzeit abzubrechen, weil das Problem ist, dass ich ein tun muss "Join" in diesem Thread, und ich möchte nicht warten, bis Timeout erreicht wird. – N0un