7 votes

iPhone : Attraper une erreur de connexion avec NSStream

J'ai écrit un programme qui se connecte à un serveur sur une IP donnée en utilisant le protocole NSStream décrit dans le guide de programmation stream d'Apple. La connexion et le transfert de données fonctionnent parfaitement, mais si l'utilisateur spécifie une mauvaise adresse IP 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 eventCode == NSStreamEventErrorOccurred, rien ne semble se produire. Mon code de connexion est le suivant :

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];

Comment puis-je spécifier un délai d'attente ou permettre à un bouton de déclencher la fermeture des flux si une connexion ne peut être établie ?

9voto

Shaggy Frog Points 20388

A valeur de temporisation ou permettre à un bouton de déclencher la fermeture des flux si une si une connexion ne peut être établie ?

Utiliser un NSTimer .

Dans votre fichier .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;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X