Domanda

Così sto utilizzando campioni PictureSharing / PictureSharingBrowser di Apple per inviare e ricevere dati. Questo utilizza un NSFileHandle sul lato server per inviare una foto utilizzando il metodo di writeData NSFileHandle.

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

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

Questo sembra funzionare bene fino a quando voglio inviare grandi quantità di dati (in questo caso vale la pena di 1 MB di dati). Quando tento questo, l'applicazione si blocca durante l'esecuzione del metodo writeData. Il client non si avvicina nemmeno la lettura dei dati, si apre semplicemente la connessione, ma non succede nulla. (Si suppone di leggere il blocco di dati per blocco, mentre il server invia tutti i dati teh in una sola volta).

Sto indovinando qualche situazione di stallo si sta verificando da qualche parte, ma non sono sicuro dove. Ho provato a cercare un asincrona. modo di scrivere i dati del mandrino da Chuck con NSFileHandle, ma non ho potuto trovare un modo.

Qualsiasi orientamento aiuterebbe!

È stato utile?

Soluzione

mi mancava un passo in fondo ... in di NSNetServiceBrowser netServiceBrowser: didFindService :( moreComing: metodo delegato, invece di semplicemente cercando di connettersi a tutti i servizi in arrivo, ho invece (come il doc dice: )) mantenere il servizio, impostare il delegato per quel servizio trovato, e tentare di risolvere il servizio.

Sono quindi in grado di aprire un flusso al servizio risolto in * - (void) netServiceDidResolveAddress: (NSNetService ) del mittente , che è metodo delegato di NSNetservice

.
- (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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top