2010-09-10 25 views
7

J'ai écrit un programme qui se connecte à un serveur sur une adresse IP donnée en utilisant le protocole NSStream décrit dans le guide de programmation de flux d'Apple. La connexion et le transfert des données fonctionnent parfaitement, mais si l'utilisateur spécifie une adresse IP incorrecte et que le programme tente d'ouvrir les flux, le programme ne répond plus. D'après ce que j'ai lu, la méthode handleEvent détecte les erreurs de flux, mais lorsque je vérifie la condition que eventCode == NSStreamEventErrorOccurred, rien ne semble se passer. Mon code de connexion est la suivante:iPhone: rattraper une erreur de connexion avec NSStream

NSString *hostString = ipField.text; 

    CFReadStreamRef readStream; 

    CFWriteStreamRef writeStream; 

    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)hostString, 10001, &readStream, &writeStream); 



    inputStream = (NSInputStream *)readStream; 

    outputStream = (NSOutputStream *)writeStream; 

    [inputStream setDelegate:self]; 

    [outputStream setDelegate:self]; 

    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

    [inputStream open]; 

    [outputStream open]; 

Toute idée de comment je peux spécifier une valeur de délai d'attente ou permettre un bouton pour déclencher la fermeture des cours d'eau si une connexion ne peut pas être fait?

Répondre

9

Toute idée de comment je peux spécifier une valeur de délai d'attente ou permettre un bouton de déclenchement la fermeture des flux si une connexion ne peut pas être fait?

Utilisez un NSTimer.

Dans votre .h:

... 
@interface MyViewController : UIViewController 
{ 
    ... 
    NSTimer* connectionTimeoutTimer; 
    ... 
} 
... 

Dans votre .m:

... 
@interface MyViewController() 
@property (nonatomic, retain) NSTimer* connectionTimeoutTimer; 
@end 

@implementation MyViewController 

... 
@synthesize connectionTimeoutTimer; 
... 

- (void)dealloc 
{ 
    [self stopConnectionTimeoutTimer]; 
    ... 
} 

// Call this when you initiate the connection 
- (void)startConnectionTimeoutTimer 
{ 
    [self stopConnectionTimeoutTimer]; // Or make sure any existing timer is stopped before this method is called 

    NSTimeInterval interval = 3.0; // Measured in seconds, is a double 

    self.connectionTimeoutTimer = [NSTimer scheduledTimerWithTimeInterval:interval 
                    target:self 
                   selector:@selector(handleConnectionTimeout:) 
                   userInfo:nil 
                    repeats:NO]; 
} 

- (void)handleConnectionTimeout 
{ 
    // ... disconnect ... 
} 

// Call this when you successfully connect 
- (void)stopConnectionTimeoutTimer 
{ 
    if (connectionTimeoutTimer) 
    { 
     [connectionTimeoutTimer invalidate]; 
     [connectionTimeoutTimer release]; 
     connectionTimeoutTimer = nil; 
    } 
}