标签: nsinputstream

使用NSXMLParser initWithStream:没有收到解析器委托方法

我正在处理的基本问题是使用NSStream类来解析传入的增量XML数据.数据永远不是一个完整的XML文档,但我希望根据套接字可以读取的内容以增量块的形式接收和处理它.

看一下文档NSXMLParser,似乎initWithStream:初始化a 的方法NSXMLParser将是我问题的完美解决方案.我可以使用a初始化解析器,NSInputStream然后在我通过套接字接收数据时调用该parse方法,然后NSXMLParser应该调用NSXMLParser委托.

但是,我没有看到任何被调用的委托,我看到被调用的唯一方法是流委托stream:handleEvent:.Apple或其他开发人员似乎很少或没有此API的示例.关于我做错了什么或如何initWithStream:正确使用的任何想法?

ContentParser.h

@interface ContentParser : NSObject <NSStreamDelegate, 
                                     NSXMLParserDelegate>
{
   NSInputStream *inputStream;
   NSOutputStream *outputStream;
   NSMutableData *receivedData;
   NSXMLParser *xmlParser;
}
- (void)initStream;
Run Code Online (Sandbox Code Playgroud)

ContentParser.m

@implementation ContentParser

- (void)initStream
{    
   CFReadStreamRef readStream;
   CFWriteStreamRef writeStream;

   CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, 
                                     (CFStringRef)@"<hostname>", 
                                     <port>, 
                                     &readStream, 
                                     &writeStream);

   inputStream = (__bridge NSInputStream *)readStream;
   outputStream = (__bridge NSOutputStream *)writeStream;

   inputStream.delegate = self;
   outputStream.delegate = self;

   [inputStream  scheduleInRunLoop:[NSRunLoop currentRunLoop]
                           forMode:NSDefaultRunLoopMode];
   [outputStream scheduleInRunLoop:[NSRunLoop …
Run Code Online (Sandbox Code Playgroud)

cocoa objective-c nsxmlparser nsinputstream nsstream

4
推荐指数
1
解决办法
2493
查看次数

RN42蓝牙在流数据的几秒钟内在iOS上断开连接

我一直在尝试使用RN-42通过蓝牙2.1从设备读取数据.该设备与iPhone或iPad Mini配对,数据流短暂流动,但iOS和BT模块在几秒钟内(小于10)断开连接(取消配对).该设备输出的数据为5-10kB/s,完全符合蓝牙规范.我还注意到的一点是,当我运行函数NSInputStream,[NSInputStream read:maxLength:]时,返回的字节数总是158或更少.应用程序和硬件不会崩溃,但蓝牙只是取消配对.

即使断开连接,设备仍然会向RN42发送数据,从而降低了电子设备问题的可能性.此设置在Android设备上也可以完美运行.我可以在没有任何断开连接或崩溃的情况下流式传输数据.

我尝试过的事情......

  • 遵循Apple提供的外部附件示例EADemo.
  • 纯粹使用运行循环而不是轮询.
  • 按照本文中的建议将流放在后台线程上.
  • 删除所有NSLog以帮助提高性能.
  • 在调试和发布模式下编译.

有一点可行的是减慢数据传输速度(即小于5kB/s),因为它允许iOS和BT模块在断开连接之前保持连接并传输更长时间的数据.

#define EAD_INPUT_BUFFER_SIZE 1024

/**
 * Stream delegate
 */
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
    switch (eventCode) {
[... other cases ...]

        case NSStreamEventHasBytesAvailable:
        {            
            uint8_t buf[EAD_INPUT_BUFFER_SIZE];
            unsigned int len = 0;
            len = [(NSInputStream *)aStream read:buf maxLength:EAD_INPUT_BUFFER_SIZE];

            if(len) {
                // Read successful, process data
            } else {
                // Fail
            }     
            break;
        }
        default:
            break;
    }
}

/**
 * Stream delegate with polling (for better or worse)
 */
    [...]
        case NSStreamEventHasBytesAvailable: …
Run Code Online (Sandbox Code Playgroud)

bluetooth nsinputstream nsstream external-accessory ios

4
推荐指数
1
解决办法
1948
查看次数

NSInputStream getBuffer:length:不起作用?

我真的想使用getBuffer:length:NSInputStream 的方法.经过大量的研究,我找不到使用这种方法的有效例子,因为大多数人真的需要read: maxLength:.

所以现在关于周围环境的一些事实:*我正在为iPhone开发应用程序,iOS 3.1.3*我已经通过套接字建立了网络通信*网络连接实际上有效; 所以我没有忘记将一个流添加到runloop或一个有效的委托或类似的东西 - 它已经工作*我只是通过网络发送和接收字符串.*我已经设置了一个有效的委托stream: handleEvent:正确(区分收到的事件并采取适当的行动).我不确定接收代码是否100%正确,因为我有时会收到两次消息.这也可能是我正在与之通信的设备上的错误实现.为了弄清楚它是最后一个指向哪一个,我试图找出当我收到"NSStreamEventHasBytesAvailable"事件时接收缓冲区上有多少字节.由于我不确定我的实现是否正确,但我想知道我收到的实际字节数,我想使用getBuffer: length:并查看之后的长度.奇怪的是:长度永远不会在控制台上打印出来 [((NSInputStream *) stream) getBuffer: &buf length: &numBytes]总是评估为FALSE.无论如何,代码的一部分之后正常工作,在缓冲区中接收消息并正确转发 - 工作正常.问题仍然存在:为什么不起作用getBuffer: length:?感兴趣的代码在这里:

`case NSStreamEventHasBytesAvailable:{

        uint8_t *buf;
        unsigned int numBytes;

        if ([((NSInputStream *) stream) getBuffer: &buf length: &numBytes]) {
            NSLog(@"\t\tBytes in the buffer: %i", &numBytes);
        }

        uint8_t buffer[BUFFER_SIZE];
        int len = [((NSInputStream *) stream) read: buffer 
                                         maxLength: BUFFER_SIZE];
        NSLog(@"\tread: %i bytes", len);

        /*
         if len > 0: len is equal to the …
Run Code Online (Sandbox Code Playgroud)

objective-c nsinputstream

3
推荐指数
1
解决办法
6049
查看次数

写入后NSOutputStream与Bad Access崩溃(Objective-c)

我一直试图为我的iOS应用程序启动并运行一个基本的TCP客户端,但是遇到了一个我似乎无法解决的问题.

到目前为止,我可以连接,发送一条消息,在服务器端收到,但随后我的应用程序崩溃.

Client.h

#import <Foundation/Foundation.h>
@interface Client : NSObject <NSStreamDelegate>
{
    NSInputStream *inputStream;
    NSOutputStream *outputStream;
}

-(void)initNetworkCommunication;
-(void)send:(NSString*)message;
@end
Run Code Online (Sandbox Code Playgroud)

Client.m

#import "Client.h"

@implementation Client

- (void)initNetworkCommunication {
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"10.0.1.51", 7769, &readStream, &writeStream);
    inputStream = ( NSInputStream *)CFBridgingRelease(readStream);
    outputStream = ( NSOutputStream *)CFBridgingRelease(writeStream);

    [inputStream setDelegate:self];
    [outputStream setDelegate:self];

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

    [inputStream open];
    [outputStream open];
}

- (void)send:(NSString*)message
{
    NSData *data = [[NSData alloc] initWithData:[message dataUsingEncoding:NSUTF8StringEncoding]];
    [outputStream write:[data bytes] maxLength:[data length]];
}

- …
Run Code Online (Sandbox Code Playgroud)

objective-c tcpclient nsinputstream nsstream nsoutputstream

3
推荐指数
1
解决办法
2388
查看次数

如何从Web服务获取类型流的数据

我想从服务器读取流数据与相应的URL,目前我正在尝试使用NSInputStream来读取数据,但我收到错误"错误2操作无法完成.没有这样的文件或目录".Web开发人员以字节为单位接收数据然后他将该数据转换为Stream,如MemoryStream(byteData)[注意:Web服务是用.net编写的]并且已经将它返回给我.读取这样一种数据的方法是什么,我试过AISHTTPRequest得到大小为0字节的文件,我再次尝试了NSURLConnction我得到了大小为0字节的文件,现在我正在使用NSInputStream并且我得到了提到的ERROR在开始.这是我的NSInputStream代码,

请指导我是否可以读取此类数据是iOS作为前端,如果是,那么指导我应该如何与这种数据进行交互.如果NSInputStream是与之交互的预期方式,那么下面写的代码中的问题是什么.

- (void)setUpStreamForFile {

    NSString *urlStr = @"http://192.168.1.201/example/example.svc/example?parameter={\"DCU_DocId\":\"05e24018-b728-4ec8-9848-d6cae02bec95\"}";

    // iStream is NSInputStream instance variable
    iStream = [[NSInputStream alloc] initWithFileAtPath:urlStr];
    [iStream setProperty:[NSDictionary dictionaryWithObjectsAndKeys:(id) kCFBooleanFalse,    kCFStreamSSLValidatesCertificateChain, nil ] forKey:(NSString *) kCFStreamPropertySSLSettings];
    [iStream setDelegate:self];
    [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                       forMode:NSDefaultRunLoopMode];
    [iStream open];
}

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
    _data = [[NSMutableData alloc] init];
    int bytesRead=0;

    switch(eventCode) {
        case NSStreamEventHasBytesAvailable:
        {
            if(!_data) {

            }
            uint8_t buf[20480];
            unsigned int len = 0;
            len = [(NSInputStream *)stream read:buf maxLength:20480];
            if(len) {
                [_data appendBytes:(const …
Run Code Online (Sandbox Code Playgroud)

c# web-services objective-c nsinputstream ios

3
推荐指数
1
解决办法
333
查看次数

Objective-C下载流畅的流媒体视频

我想知道是否有一种方法可以使用Objective-C下载一个mp4视频,该视频设置为以流媒体格式流式传输.到目前为止,我已经尝试了AFNetworking,NSInputStream和MPMoviePlayerController来尝试访问原始视频数据,但每次尝试都空了.

我想把这个视频数据保存为mp4到磁盘,以便离线播放.URL看起来像这样:

     http://myurl.com/videoname.ism/manifest(format=m3u8-aapl)
Run Code Online (Sandbox Code Playgroud)

video objective-c nsinputstream smooth-streaming afnetworking

3
推荐指数
1
解决办法
1088
查看次数

来自PHAsset url的NSInputStream - iOS照片框架

我正在尝试从AVURLAsset网址创建一个NSInputStream,用于从照片框架中获取视频文件(或来自PHAsset网址的照片).我的代码如下

mAsset = [NSInputStream inputStreamWithFileAtPath:[murl path]];
[mAsset open];
Run Code Online (Sandbox Code Playgroud)

网址为file:///var/mobile/Media/DCIM/100APPLE/IMG_0519.JPG

现在当我读一读

NSUInteger readLength = [mAsset read:(uint8_t *)data maxLength:maxSize];
Run Code Online (Sandbox Code Playgroud)

readLength返回-1.我认为它与iOS照片资产的权限有关

如果这种方式不正确,我可以通过照片框架资产从视频或图像文件中流式传输数据.任何帮助将不胜感激.

nsinputstream ios photosframework

3
推荐指数
1
解决办法
954
查看次数

我想念的是什么?:iPhone Objective-C NSInputStream initWithData

我正在从NSData对象创建一个NSInputStream,但是一旦创建了流,就会报告hasBytesAvailable的NO:

NSData* data = [outputStream propertyForKey: NSStreamDataWrittenToMemoryStreamKey]; 
NSLog(@"creating stream with data 0x%x length %d", [data bytes], [data length]);
NSInputStream *insrm = [[NSInputStream alloc] initWithData:data];
[insrm open];

uint8_t* buf = NULL;
NSUInteger len;
BOOL result = [insrm getBuffer:&buf length:&len];
BOOL hasbytes = [insrm hasBytesAvailable];
NSLog(@"getBuffer:%d hasBytes:%d", result, hasbytes);
NSLog(@"created inputstream data %d len %d", buf, len);
Run Code Online (Sandbox Code Playgroud)

日志:

[26797:20b] creating stream with data 0x7050000 length 34672
[26797:20b] getBuffer:0 hasBytes:0
[26797:20b] created inputstream data 0 len 0
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

iphone objective-c nsinputstream nsdata

2
推荐指数
1
解决办法
6572
查看次数

我无法初始化NSInputStream

请帮助我,我疯了.我需要创建一个,NSInputStream所以我可以通过wifi从相机读取实时预览.liveViewStream是一个NSInputStream-Instance-Variable,在我的实现中声明如下:

@implementation MKSonyCamHandler{
    NSInputStream *liveViewStream;
}
Run Code Online (Sandbox Code Playgroud)

liveViewURL是一个有效的URL,当我连接到相机的网络时,我可以在我的浏览器中打开(虽然我不认为这有任何区别).我已经检查过它存在,不是零并且保持我期望的值.但是当我这样做时:

liveViewStream = [[NSInputStream alloc] initWithURL:liveViewURL];
DLog(@"%@", liveViewStream);
Run Code Online (Sandbox Code Playgroud)

alloc-init命令之后的DLog每次都会记录"(null)",如果我知道原因,就会被诅咒.有没有人遇到过这个?我在这里错过了一些明显的东西吗?我第一次与之合作NSStreams,是否有一个常见的陷阱可能是原因?文档清楚地说明了-initWithURL:

Creates and returns an initialized NSInputStream object that reads data from
the file at a given URL.
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我开始觉得这里真的很蠢.

编辑:我正在使用ARC.

iphone cocoa-touch nsinputstream nsstream ios

2
推荐指数
1
解决办法
1641
查看次数

如何将NSInputStream转换为NSString或如何读取NSInputStream

我正在尝试将输入流转换为字符串。我要转换的输入流是NSURLRequest.HTTPBodyStream,显然将httpbody设置为null,并在发出请求后将其替换为该流。我该怎么做呢?这是我到目前为止的内容:

#define MAX_UTF8_BYTES 6
    NSString *utf8String;
    NSMutableData *_data = [[NSMutableData alloc] init]; //for easy 'appending' bytes

    int bytes_read = 0;
    while (!utf8String) {
        if (bytes_read > MAX_UTF8_BYTES) {
            NSLog(@"Can't decode input byte array into UTF8.");
            break;
        }
        else {
            uint8_t byte[1];
            [r.HTTPBodyStream read:byte maxLength:1];
            [_data appendBytes:byte length:1];
            utf8String = [NSString stringWithUTF8String:[_data bytes]];
            bytes_read++;
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我打印字符串时,它要么总是为空,要么包含单个字符,甚至不输出null。有什么建议么?

objective-c nsinputstream ios

2
推荐指数
1
解决办法
1262
查看次数