Pregunta

Así que estoy usando muestras PictureSharing / PictureSharingBrowser de Apple para enviar y recibir datos. Este utiliza un NSFileHandle en el lado del servidor para enviar una imagen utilizando el método de WriteData NSFileHandle.

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

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

Esto parece muy bien el trabajo hasta que quiero enviar grandes cantidades de datos (en este caso el valor de 1 MB de datos). Cuando intento esto, la aplicación se bloquea al ejecutar el método WriteData. El cliente ni siquiera comienza la lectura de los datos, simplemente se abre la conexión, pero no pasa nada. (Se supone que debe leer el fragmento de datos a pedazo, mientras que el servidor envía todos los datos a la vez teh).

supongo algunos de interbloqueo se produce en alguna parte, pero no estoy seguro de dónde. Traté de buscar una asíncrona. forma de escribir el mandril de datos por Chuck con NSFileHandle, pero no pude encontrar una manera.

Cualquier orientación ayudaría!

¿Fue útil?

Solución

perdió un paso básicamente ... en NSNetServiceBrowser de netServiceBrowser: didFindService :( moreComing: método delegado, en vez de mí simplemente tratando de conectarse a cada servicio de entrada, que en su lugar (como dice el doctor: )) mantener el servicio, configurar el delegado para ese servicio que se incluyen, e intentará resolver el servicio.

soy capaz entonces de abrir una secuencia al servicio resuelto en * - (void) netServiceDidResolveAddress: (NSNetService ) remitente , que es el método delegado de 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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top