Frage

Also ich bin mit Apples PictureSharing / PictureSharingBrowser Proben, Daten zu senden und empfangen. Dieser verwendet eine NSFileHandle auf der Server-Seite ein Bild mit NSFileHandle der Methode Writedata zu senden.

NSFileHandle * incomingConnection = [[aNotification userInfo] objectForKey:NSFileHandleNotificationFileHandleItem];

[[aNotification object] acceptConnectionInBackgroundAndNotify];
[incomingConnection writeData:dataToWrite];
[incomingConnection closeFile];

Das scheint zu funktionieren gut, bis ich große Datenmengen senden möchte (in diesem Fall 1 MB im Wert von Daten). Als ich dies versuchen, die Anwendung hängt, während die Ausführung der Methode Writedata. Der Kunde nicht einmal ansatzweise die Daten zu lesen, es öffnet einfach die Verbindung, aber nichts passiert. (Es soll den Datenblock von Klumpen lesen, während der Server alle teh Daten auf einmal sendet).

Ich vermute, einige Deadlock irgendwo auftreten, aber ich bin nicht sicher, wo. Ich habe versucht, für einen Asynchron zu suchen. Art und Weise der Daten chuck durch Futter mit NSFileHandle zu schreiben, aber ich konnte eine solche Art und Weise nicht finden.

Jede Führung würde helfen!

War es hilfreich?

Lösung

Ich vermisste einen Schritt im Grunde ... in NSNetServiceBrowser der netServiceBrowser: didFindService :( moreComing: Delegatmethode, anstatt ich einfach versuchen, jeden eingehenden Service zu verbinden, ich stattdessen (wie die Doc sagt: )) behält den Dienst, stellen Sie die Delegierten für vorgefundener Dienst, und versucht, den Dienst zu lösen.

Ich bin dann in der Lage, einen Stream den aufgelösten Dienst zu öffnen in * - (void) netServiceDidResolveAddress: (NSNetService ) Absender , die NSNetservice der Delegatmethode ist

.
- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing {
    [aNetService retain];
    [aNetService setDelegate:self];
    [aNetService resolveWithTimeout:5.0];

}

- (void)netServiceDidResolveAddress:(NSNetService *)service{

    NSInputStream * istream;
    [sender getInputStream:&istream outputStream:nil];
    [istream retain];
    [istream setDelegate:self];
    [istream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [istream open];

    [service release];
}

//... NSStreamDelegate method to retrieve the data via the stream.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top