Schließen Sie die Verbindung, wenn NSOutputStream beendet ist

8

Wie kann eine Verbindung geschlossen werden, wenn der NSOutputStream mit dem Senden von Daten fertig ist?

Nach der Suche habe ich festgestellt, dass das Ereignis NSStreamEventEndEncountered nur aufgerufen wird, wenn der Server die Verbindung abbricht. nicht, wenn der OutputStream die zu sendenden Daten beendet hat.

StreamStatus gibt immer 0 (Verbindung geschlossen) oder 2 (Verbindung offen) zurück, aber niemals 4 (Daten schreiben).

Da beide oben genannten Methoden mir nicht genug über den Schreibprozess sagen, bin ich nicht in der Lage, einen Weg zu finden, festzustellen, ob der Stream noch schreibt oder ob er fertig ist und ich die Verbindung jetzt schließen kann.

Nach 5 Tagen des googleling und des Versuchens bin ich völlig aus Ideen ... Irgendeine Hilfe geschätzt. Danke

BEARBEITEN SIE DEN HINZUGEFÜGTEN CODE WIE BEANTRAGT:

%Vor%     
sharkyenergy 28.04.2013, 19:23
quelle

1 Antwort

4

Es kann zwei Interpretationen zu Ihrer Frage geben. Wenn das, was Sie fragen, ist "Ich habe einen NSOutputStream und ich bin fertig damit zu schreiben, wie kann ich dies signalisieren?" dann ist die Antwort so einfach wie die Methode close aufzurufen.

Alternativ können Sie, wenn Sie wirklich sagen "Ich habe einen NSInputStream und ich möchte wissen, wann ich das Ende des Stream erreicht habe", auf hasBytesAvailable oder streamStatus == NSStreamStatusAtEnd schauen.

Zu Ihrer Information, um den Status NSStreamStatusWriting zu erhalten, müssten Sie die streamStatus-Methode von einem anderen Thread aufrufen, während dieser Thread write:maxLength: aufruft.

--- Bearbeiten: Code Vorschlag

Der Grund, warum Sie nie benachrichtigt werden, ist, dass ein Ausgabestream nie abgeschlossen ist (es sei denn, es handelt sich um einen Stream mit fester Größe, der kein FTP-Stream ist). Es ist der Eingabestrom, der "fertig" wird, an dem Sie Ihren Ausgabestream schließen können. Das ist die Antwort auf Ihre ursprüngliche Frage.

Als weiteren Vorschlag würde ich die Ablaufplanung für die Ablaufsteuerung und die "Ereignisverarbeitung" außer für die Handhabung von Fehlern im Ausgabestrom überspringen. Dann würde ich den Lese- / Schreibcode in eine NSOperation-Unterklasse schreiben und sie in eine NSOperationQueue senden. Wenn Sie einen Verweis auf die NSOperationen in dieser Warteschlange beibehalten, können Sie diese problemlos abbrechen und sogar eine Fortschrittsanzeige anzeigen, indem Sie eine percentComplete-Eigenschaft hinzufügen. Ich habe den Code unten getestet und es funktioniert. Ersetzen Sie meinen Speicherausgabestream durch Ihren FTP-Ausgabestream. Sie werden feststellen, dass ich die Validierungen übersprungen habe, die Sie natürlich behalten sollten. Sie sollten wahrscheinlich außerhalb der NSOperation durchgeführt werden, um die Abfrage des Benutzers zu erleichtern.

%Vor%     
aLevelOfIndirection 28.04.2013, 19:58
quelle