2010-09-10 11 views
7

He escrito un programa que se conecta a un servidor en una IP dada usando el protocolo NSStream descrito en la guía de programación de transmisión de Apple. La conexión y transferencia de datos funciona sin problemas, sin embargo, si el usuario especifica una dirección IP incorrecta y el programa intenta abrir las transmisiones, el programa deja de responder.iPhone: Detectando un error de conexión con NSStream

Según lo que he leído, el método handleEvent detecta errores de flujo, sin embargo, cuando verifico la condición de que eventCode == NSStreamEventErrorOccurred, nada parece suceder. Mi código de conexión es el siguiente:

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

alguna idea de cómo puedo especificar un valor de tiempo de espera o permitir un botón para activar el cierre de las corrientes, si no se puede establecer una conexión?

Respuesta

9

alguna idea de cómo puedo especificar un valor de tiempo de espera o permitir a un botón de disparo el cierre de las corrientes si no se puede hacer una conexión?

Usa un NSTimer.

En su .h:

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

En su .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; 
    } 
} 
Cuestiones relacionadas