NSStream und Steckdosen, NSStreamDelegate Methoden nicht aufgerufen
Ich habe den guide befolgt Einrichten Socket-Streams und tatsächlich dupliziert den code in meine Klasse. Egal was ich versuche die delegate-Methoden scheinen nicht nur genannt, bekommen.
In der header-Datei habe ich (grundsätzlich):
@interface myClass : NSObject <NSStreamDelegate> {
NSInputStream *inputStream;
NSOutputStream *outputStream;
}
- (void)connect;
@end;
Die connect-Methode:
- (void)connect {
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef)@"host.example.com", 1234, &readStream, &writeStream);
inputStream = (NSInputStream *)readStream;
outputStream = (NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
}
Habe auch versucht mit CFStreamCreatePairWithSocketToCFHost()
und [NSStream getStreamsToHost:port:inputStream:outputStream:
- alle mit exakt dem gleichen Ergebnis.
Habe ich einen Haltepunkt am Anfang der connect
Methode, trat durch jede Zeile und jeder Zeiger gültig ist und scheint zu zeigen, um das richtige Objekt.
In GDB, nach der setDelegate
fordert po [inputStream delegate]
Drucke <myClass: 0x136380>
als erwartet, so hat es der Delegierten richtig.
Für das Leben von mir ich kann nicht herausfinden, warum es sich weigert, rufen Sie die stream:handleEvent:
Methode an meine Klasse:
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
NSLog(@"got an event");
}
Hoffentlich habe ich etwas verpasst, wirklich einfach und offensichtlich ist, und ein zweites paar Augen erkennen können, mein Fehler.
Vielen Dank im Voraus, wer hat die Geduld und die Zeit genommen, so weit zu Lesen!
InformationsquelleAutor arrtchiu | 2011-02-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Zeilen wie diese:
Anstatt
[NSRunLoop currentRunLoop]
ich es geändert[NSRunLoop mainRunLoop]
.BEARBEITEN 2011-05-30:
Der Grund, warum dies nicht funktioniert hat ist weil ich war das einrichten des sockets in einen hintergrund-thread über
+[NSThread detachNewThreadSelector:toTarget:withObject:]
.Tun es auf diese Weise erstellt eine neue Schlinge, welche nach dem Lesen der führen Sie loop-Entwickler-Dokumentation entdeckte ich, dass Sie sagen müssen, die NSRunLoop manuell ausführen.
Läuft es in die gleiche Schleife laufen, da der Haupt-thread wurde fein auf die Leistung, aber ich war in der Lage, squeeze ein wenig mehr Leistung durch das schreiben eine wrapper-Klasse und die laufen alle Netzwerk-I/O auf einem hintergrund-thread.
Bearbeitet meine Reaktion zu erklären.
könnte u potenziell post das Ende von code? Aus irgendeinem Grund, ich habe die [NSRunLoop currentRunLoop] [NSRunLoop mainRunLoop] und die Verbindung nicht ausfällt, kurz nachdem es initiiert
Sie nagelte ihn! nach dem entfernen meine socket-client aus dem Haupt-thread, ich hörte nicht mehr zu den inputStream (obwohl mein Ausgabestrom war noch arbeiten, wie ich konnte-monitor auf der socket-server). ich habe gerade den inputstream s run-Schleife und bingo! Von Ihnen positiv bewertet werden 🙂
sowohl Ihre Frage und die Antwort hat mir geholfen, zu wissen, wo zu gehen, aber ich bin nicht sicher, wie Sie Sie beginnen und schließen mit einem einfachen button??
InformationsquelleAutor arrtchiu
Diese Lösung wird funktionieren, wenn & nur wenn Sie nicht über die weitere Arbeit blockiert auf thread 0. Dies ist oft OK, aber eine bessere Lösung ist einen neuen thread erstellen (also eine Klasse Methode, um den thread on-demand) und dann enqueue in diesem thread.
also
Mit diesem können Sie planen, den input-stream mit:
Wird diese ermöglichen es Ihnen, Ihre Netzwerk-Operationen, ohne sich sorgen über deadlocks mehr.
Einer unserer tutorial-apps gibt. Wenn Sie noch auf der Suche nach Hilfe, möchten Sie vielleicht, check it out in parse.com/tutorials/anypic#post Schauen Sie sich die etwas über 'speichern der PFObject.' Obwohl unser framework verbirgt, die etwas in den hintergrund Aufgabe macht ein Netzwerk nennen.
Dieser code ausreichend Abfluss der autorelease-pool regelmäßig? Die Dokumentation für
-[NSRunLoop run]
sagt, dass es immer wieder aufrufenrunMode:beforeDate:
. Das bedeutet, dass es keine chance für den autorelease-pool entleert werden, zwischen diesen Anrufungen.InformationsquelleAutor Thomas Bouldin