2009-11-29 6 views
0

dans une application iPhone, j'ai une connexion socket via le wifi, et je dois lire depuis inputStream et écrire sur outputStream. Le problème est que la gestion de flux est pilotée par les événements, et je dois attendre l'événement NSStreamEventHasBytesAvailable avant de le lire. Donc, je ne peux pas savoir en lisant \ écriture en dehors de la méthode handleEvent: eventCode delegate.NSStream lecture écriture en dehors de la méthode déléguée handleEvent: code événement

J'ai essayé une boucle while, mais je réalise que pendant la boucle while l'application ne reçoit pas les messages des délégués et arrête jamais:

Pseudo-code:

-(void) myFunction { 
    canRead=NO; 
    [self writeToStream:someData]; 
    while(!canRead) { }; 
    readData=[self readFromStream]; 
} 

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { 

    switch(eventCode) { 
      case NSStreamEventHasBytesAvailable: { 
     canRead=YES; 
     break; 
     } 
     } 
} 

Je pense que je pourrais lire \ write dans la méthode delegate, mais j'ai besoin de lire \ write plusieurs fois en dehors de cela.

Aide! Merci

Répondre

-1

La classe de flux a probablement placé un événement sur EventQueue pour appeler "stream: handleEvent:". La file d'attente d'événements ne peut pas être lue si votre code ne retourne pas le contrôle au gestionnaire d'événements. Ce que vous voulez probablement faire au lieu de cette façon est:

Voir http://developer.apple.com/iphone/library/documentation/cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/performSelectorOnMainThread:withObject:waitUntilDone:

et aperçu général de la programmation Cocoa: http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CoreAppArchitecture/CoreAppArchitecture.html#//apple_ref/doc/uid/TP40002974-CH8-SW45

-(void)myFunction1 { 
    [self writeToStream:somedata]; 
} 
-(void)myFunction2 { 
    readData=[self readFromStream]; 
} 
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { 
    switch(eventCode) { 
      case NSStreamEventHasBytesAvailable: { 
      [self myFunction2]; 
     break; 
     } 
     } 
} 
Questions connexes