2010-06-27 8 views
0

J'utilise donc les exemples PictureSharing/PictureSharingBrowser d'Apple pour envoyer et recevoir des données. Cela utilise un NSFileHandle côté serveur pour envoyer une image en utilisant la méthode writeData de NSFileHandle.Envoi de grandes quantités de données avec 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 j'essaie 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 supposé lire le morceau de données par morceau, tandis que le serveur envoie toutes les données à la fois).

Je suppose qu'une certaine impasse se produit quelque part, mais je ne sais pas où. J'ai essayé de chercher un asynchrone. façon d'écrire le mandrin de données par mandrin avec NSFileHandle, mais je ne pouvais pas trouver un tel moyen.

Toute aide serait utile!

+0

Hmm ... Ce que j'ai déterminé est cela se produit que lorsque je ne dispose que d'une seule instance de ma course d'application, et il est à la fois un serveur et un client. Quand j'exécute deux instances et en ai une en tant que serveur et l'autre en tant que client, tout fonctionne bien, mais j'ai besoin de la possibilité d'avoir une seule instance agissant comme serveur et client (un utilisateur peut partager ses informations avec d'autres et aussi voir les informations que les autres partagent) – Patrick

Répondre

0

I Missed un pas essentiellement ... dans netServiceBrowser de NSNetServiceBrowser: 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 :)) conserve la service, définissez le délégué pour ce service trouvé et tentez 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. 
Questions connexes