I cannot initialize a NSInputStream

 ̄綄美尐妖づ 提交于 2019-12-23 01:21:13

问题


Please help me, im going insane. I need to create an NSInputStream so i can read a live preview from a camera over wifi. liveViewStream is an NSInputStream-Instance-Variable that is declared in my implementation like so:

@implementation MKSonyCamHandler{
    NSInputStream *liveViewStream;
}

liveViewURL is a valid URL that i can open in my browser when i connect to the camera's network (although i dont think that this makes any difference). I have checked that it exists, is not nil and holds the value that i expect. But when i do this:

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

The DLog after the alloc-init commands will log "(null)" every time, and ill be damned if i know why. Has anybody ever encountered this? Am i missing something glaringly obvious here? Its my first time working with NSStreams, is there a common pitfall that might be the reason? The docs clearly state that -initWithURL:

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

Any ideas? Im starting to feel really stupid here.

EDIT: i am using ARC.


回答1:


Thanks everyone, i found it.

The thing is, my question already had all the clues i would have needed, because, like i wrote, NSStream`s -initWithURL: will

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

What I didn't see is that this is only true for local sources. If you want a remote host, (i had a wireless network connection) you need to use something else, because, and i quote the docs again here:

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

Well, for what its worth, you need to create a CFReadStreamRef and a CFWriteStreamRef, and then use the magic function CFStreamCreatePairWithSocketToHost to connect them to your host. After that, you can cast them to NSInputStream and NSOutputStream respectively, and they will work as intended. Heres a code example from the docs:

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

Hope this helps someone at some point.

@leparlon:

Im upvoting your answer, since you were definitly on the right track, suggesting the use of initWithData.




回答2:


If you are using ARC, that might fix it:

EDIT: Downloading it into a NSData first might fix it

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


来源:https://stackoverflow.com/questions/20571069/i-cannot-initialize-a-nsinputstream

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!