2013-12-13 3 views
2

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

@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. 

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

EDIT: Я использую ARC.

+0

Вы уверены, что URL-адрес не нуль, является правильным URL-адресом, доступен и передает поток данных? – Jasarien

+0

@Jasarien - как я уже сказал, я могу открыть его в своем браузере. Я могу зарегистрировать его. Отладчик показывает правильное значение. Я бы не знал, что еще проверить ... – katzenhut

+0

Что открывается в браузере при доступе к URL? – Jasarien

ответ

6

Спасибо всем, я нашел его.

Дело в том, что мой вопрос уже все подсказки я нуждался бы, потому что, как я писал, 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. 

Ну, за что его стоит, вам нужно создать a 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]; 

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

@leparlon:

Im upvoting ваш ответ, так как вы были определенно на правильном пути, что предполагает использование initWithData.

1

Если вы используете ARC, которые могли бы это исправить:

EDIT: загружая его в NSData первый может исправить это

NSInputStream *tempStream; 
NSData *tempData = [NSData dataWithContentsOfURL:@"Your Url"]; 
tempStream = [[NSInputStream alloc] initWithData:tempData]; 
liveViewStream = tempStream; 
DLog(@"%@", liveViewStream); 
+0

благодарим вас за быстрый ответ, но он не работал. Теперь и tempStream, и liveViewStream (null). – katzenhut

+1

Проверьте мой новый ответ, если вы все еще заинтересованы;) – katzenhut

Смежные вопросы