NSStream висит на близком - PullRequest
3 голосов
/ 23 июля 2010

У меня есть NSInputStream и NSOutputStream в приложении iphone, которые подключены к серверу.Я могу читать и записывать данные в сокеты без проблем.Проблема в том, что у меня есть кнопка отключения, и когда я пытаюсь вызвать close в одном из потоков, приложение зависает.Я предполагаю, что я пытаюсь позвонить близко не в то время, но я не уверен, что это правильное время.

Ответы [ 3 ]

2 голосов
/ 03 мая 2011

Скорее всего, вы не сохранили свои входные и выходные потоки после их получения :) У меня была точно такая же проблема, но мне стоило много времени, чтобы найти решение :)

1 голос
/ 23 июля 2010

Вы должны убедиться, что говорите нижележащему слою, чтобы он закрыл для вас собственный сокет. Вот код из одного из моих приложений, которые работают в сети:

...
CFReadStreamRef readStreamRef;
CFWriteStreamRef writeStreamRef;

CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)host, port, &readStreamRef, &writeStreamRef);

if (readStreamRef && writeStreamRef)
{
    CFReadStreamSetProperty(readStreamRef, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
    CFWriteStreamSetProperty(writeStreamRef, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);

    inputStream = (NSInputStream*)readStreamRef;
    outputStream = (NSOutputStream*)writeStreamRef;
    ...
0 голосов
/ 05 декабря 2012

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

NSOutputStream *outputStream = (NSOutputStream *)CFBridgingRelease(writeStream);
**[outputStream retain];**
[outputStream setDelegate:self];
[outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop]
                                forMode:NSDefaultRunLoopMode];
[outputStream open];
...