iPhone: обнаружение ошибки подключения с помощью NSStream - PullRequest
7 голосов
/ 10 сентября 2010

Я написал программу, которая подключается к серверу по заданному IP-адресу с использованием протокола NSStream, описанного в руководстве по потоковому программированию Apple. Подключение и передача данных работают безупречно, однако, если пользователь указывает неправильный IP-адрес и программа пытается открыть потоки, это приводит к тому, что программа перестает отвечать на запросы.

Из того, что я прочитал, метод handleEvent обнаруживает потоковые ошибки, однако, когда я проверяю условие, что eventCode == NSStreamEventErrorOccurred, кажется, ничего не происходит. Мой код подключения выглядит следующим образом:

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

Есть идеи, как я могу указать значение тайм-аута или позволить кнопке инициировать закрытие потоков, если не удается установить соединение?

1 Ответ

9 голосов
/ 10 сентября 2010

Любая идея относительно того, как я могу указать значение тайм-аута или разрешить для кнопки инициировать закрытие потоков, если соединение не может быть установлено?

Используйте NSTimer.

В вашем .h:

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

В вашем .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;
    }
}
...