2010-09-10 7 views
7

Ho scritto un programma che si collega a un server su un dato IP utilizzando il protocollo NSStream delineato nella guida alla programmazione del flusso Apple. La connessione e il trasferimento di dati funzionano in modo impeccabile, tuttavia se l'utente specifica l'IP errato e il programma tenta di aprire i flussi, il programma non risponde.iPhone: rilevamento di un errore di connessione con NSStream

Da quello che ho letto, il metodo handleEvent rileva errori di flusso, tuttavia quando controllo la condizione che eventCode == NSStreamEventErrorOccurred, non sembra accadere nulla. Il mio codice di connessione è la seguente:

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

Qualsiasi idea di come posso specificare un valore di timeout o consentire per un pulsante per attivare la chiusura dei corsi d'acqua, se la connessione non può essere fatta?

risposta

9

Qualsiasi idea di come posso specificare un valore di timeout o consentire un pulsante per grilletto la chiusura dei corsi d'acqua, se una connessione non può essere fatto?

Utilizzare un NSTimer.

Nel vostro .h:

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

Nel vostro .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; 
    } 
} 
Problemi correlati