Question

J'utilise des échantillons PictureSharing / PictureSharingBrowser d'Apple pour envoyer et recevoir des données. Celui-ci utilise un NSFileHandle du côté du serveur pour envoyer une image en utilisant la méthode de writeData NSFileHandle.

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

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

Cela semble fonctionner très bien jusqu'à ce que je veux envoyer de grandes quantités de données (dans ce cas, une valeur de 1 Mo de données). Lorsque je tente cela, l'application se bloque lors de l'exécution de la méthode writeData. Le client ne commence même pas lire les données, il ouvre simplement la connexion, mais rien ne se passe. (Il est censé lire le bloc de données par morceau, alors que le serveur envoie toutes teh données à la fois).

Je devine une certaine impasse se produit quelque part, mais je ne sais pas où. J'ai essayé de chercher un async. façon d'écrire le mandrin de données par mandrin avec NSFileHandle, mais je ne pouvais pas trouver une telle manière.

Toute orientation serait utile!

Était-ce utile?

La solution

Je manqué un pas essentiellement ... dans NSNetServiceBrowser de netServiceBrowser: didFindService :( moreComing: méthode déléguée, au lieu de simplement essayer de me connecter à tous les services entrant, je place (comme le doc dit: )) conserver le service, définissez le délégué pour ce service trouvé, et tenter de résoudre le service.

Je suis alors en mesure d'ouvrir un flux au service résolu en * - (void) netServiceDidResolveAddress: (NSNetService ) expéditeur qui est la méthode déléguée 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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top