Я не могу инициализировать NSInputStream

Пожалуйста, помогите мне, я схожу с ума. Мне нужно создать NSInputStream, чтобы я мог читать предварительный просмотр с камеры через Wi-Fi. liveViewStream — это NSInputStream-Instance-Variable, которая объявлена ​​в моей реализации следующим образом:

@implementation MKSonyCamHandler{
    NSInputStream *liveViewStream;
}

liveViewURL — это допустимый URL-адрес, который я могу открыть в своем браузере при подключении к сети камеры (хотя я не думаю, что это имеет какое-то значение). Я проверил, что он существует, не равен нулю и содержит ожидаемое значение. Но когда я делаю это:

liveViewStream = [[NSInputStream alloc] initWithURL:liveViewURL];
DLog(@"%@", liveViewStream);

DLog после команд alloc-init каждый раз будет регистрировать «(null)», и будь я проклят, если я знаю, почему. Кто-нибудь когда-нибудь сталкивался с этим? Я пропустил что-то явно очевидное здесь? Я впервые работаю с NSStreams, есть ли общая ошибка, которая может быть причиной? В документах четко указано, что -initWithURL:

Creates and returns an initialized NSInputStream object that reads data from
the file at a given URL.

Есть идеи? Я начинаю чувствовать себя действительно глупо здесь.

РЕДАКТИРОВАТЬ: я использую ARC.


person katzenhut    schedule 13.12.2013    source источник
comment
Вы уверены, что URL-адрес не равен нулю, является правильным URL-адресом, доступен и передает поток данных?   -  person Jasarien    schedule 13.12.2013
comment
@Jasarien - как я уже сказал, я могу открыть его в своем браузере. Я могу это зарегистрировать. Отладчик показывает правильное значение. не знаю что еще проверить...   -  person katzenhut    schedule 13.12.2013
comment
Что открывается в браузере при доступе к URL-адресу?   -  person Jasarien    schedule 13.12.2013
comment
@Jasarien - показывает черную страницу, которая повторяет введенный мной URL. Кроме того, загрузчик в Firefox не перестанет вращаться. мне кажется потоком.   -  person katzenhut    schedule 13.12.2013
comment
@Jasarien - wireshark также подтверждает, что данные доставляются   -  person katzenhut    schedule 13.12.2013
comment
@Jasarien - проблема в том, что это не видеопоток, а некоторые данные, которые мне нужно преобразовать в JPEG после их получения. Я не думаю, что Firefox (или любой другой браузер) может просто отображать поток без интерпретации заголовка пакетов.   -  person katzenhut    schedule 13.12.2013
comment
это правда, я просто пытался выяснить, поступают ли данные из потока, но вы доказали, что они есть, поэтому я не знаю, что может вызывать здесь проблемы.   -  person Jasarien    schedule 13.12.2013
comment
Вы можете попробовать загрузить данные в NSData, а затем использовать: [[NSInputStream alloc] initWithData:TheData]; так должно быть надежнее.   -  person leparlon    schedule 13.12.2013
comment
@leparlon - спасибо за предложение, но это потенциально бесконечный поток. Или я могу просто начать загружать его в NSData, а затем как бы передавать его из незавершенного объекта данных? Это звучит как-то странно для меня. Хотя попробую в понедельник.   -  person katzenhut    schedule 13.12.2013


Ответы (2)


Всем спасибо, нашел.

Дело в том, что в моем вопросе уже были все подсказки, которые мне были бы нужны, потому что, как я уже писал, NSStream's -initWithURL: будет

Create and return an initialized NSInputStream object that reads data from
the file at a given URL.

Чего я не видел, так это того, что это верно только для местных источников. Если вам нужен удаленный хост (у меня было беспроводное сетевое подключение), вам нужно использовать что-то еще, потому что, и я снова цитирую документы здесь:

The NSStream class does not support connecting to a remote host on iOS.

Ну, что бы это ни стоило, вам нужно создать CFReadStreamRef и CFWriteStreamRef, а затем использовать волшебную функцию CFStreamCreatePairWithSocketToHost, чтобы подключить их к вашему хосту. После этого вы можете преобразовать их в NSInputStream и NSOutputStream соответственно, и они будут работать как задумано. Вот пример кода из документации:

    CFReadStreamRef readStream;

    CFWriteStreamRef writeStream;

    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)[website host], 80, &readStream, &writeStream);



    NSInputStream *inputStream = (__bridge_transfer NSInputStream *)readStream;

    NSOutputStream *outputStream = (__bridge_transfer NSOutputStream *)writeStream;

    [inputStream setDelegate:self];

    [outputStream setDelegate:self];

    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

    [inputStream open];

    [outputStream open];

Надеюсь, это поможет кому-то в какой-то момент.

@лепарлон:

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

person katzenhut    schedule 07.01.2014

Если вы используете ARC, это может исправить ситуацию:

РЕДАКТИРОВАТЬ: сначала загрузите его в NSData, это может исправить

NSInputStream *tempStream;
NSData *tempData = [NSData dataWithContentsOfURL:@"Your Url"]; 
tempStream = [[NSInputStream alloc] initWithData:tempData]; 
liveViewStream = tempStream; 
DLog(@"%@", liveViewStream);
person leparlon    schedule 13.12.2013
comment
спасибо за быстрый ответ, но это не сработало. Теперь и tempStream, и liveViewStream являются (нулевыми). - person katzenhut; 13.12.2013
comment
Проверьте мой новый ответ, если вам все еще интересно;) - person katzenhut; 07.01.2014