Как программно закрыть ввод/вывод NSStream

У меня есть приложение, которое подключает пользователей к серверу. Пользователи могут подключаться к хосту для связи, вставляя IP-адрес, и общаться с помощью NSStream. Нажатие кнопки подключения запускает соединение с хостом, и пользователь может получать и отправлять сообщения.

Я хочу дать пользователю возможность отключиться от сервера, чтобы не слушать нажатие кнопки отключения. Проблема в том, что я никогда не могу успешно закрыть поток.

Это моя текущая реализация:

// Create connection "Connect Button"
- (void)initNetworkCommunication:(UIViewController *)sender {
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"123.456.789.123", 80, &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];
    controller = sender;
}

// Stop connection "Disconnect Button"
- (void)stopNetworkConnection {
    [inputStream close];
    [outputStream close];
    [inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream release];
    [outputStream release];
    inputStream = nil;
    outputStream = nil;
    NSLog(@"Disconnect from stream");
}

Ход операций следующий:

  1. Пользователь вводит действительный IP-адрес;
  2. Пользователь нажимает «Кнопку подключения»;
  3. Все работает нормально, соединение установлено и пользователь может отправлять/получать сообщения;
  4. Пользователь нажимает «Кнопку отключения», и пользователь не получает сообщения;
  5. Пользователь нажимает «Кнопку подключения», но больше не может подключиться

Я пробовал это решение, но оно не сработало:

Ошибка закрытия и открытия NSStream

Заранее спасибо за помощь


person andreapavan    schedule 10.11.2013    source источник