我正在处理的基本问题是使用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) 我一直在尝试使用RN-42通过蓝牙2.1从设备读取数据.该设备与iPhone或iPad Mini配对,数据流短暂流动,但iOS和BT模块在几秒钟内(小于10)断开连接(取消配对).该设备输出的数据为5-10kB/s,完全符合蓝牙规范.我还注意到的一点是,当我运行函数NSInputStream,[NSInputStream read:maxLength:]时,返回的字节数总是158或更少.应用程序和硬件不会崩溃,但蓝牙只是取消配对.
即使断开连接,设备仍然会向RN42发送数据,从而降低了电子设备问题的可能性.此设置在Android设备上也可以完美运行.我可以在没有任何断开连接或崩溃的情况下流式传输数据.
我尝试过的事情......
有一点可行的是减慢数据传输速度(即小于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) 我真的想使用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) 我一直试图为我的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) 我想从服务器读取流数据与相应的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) 我想知道是否有一种方法可以使用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
我正在尝试从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照片资产的权限有关
如果这种方式不正确,我可以通过照片框架资产从视频或图像文件中流式传输数据.任何帮助将不胜感激.
我正在从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)
我在这里错过了什么?
请帮助我,我疯了.我需要创建一个,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.
我正在尝试将输入流转换为字符串。我要转换的输入流是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。有什么建议么?
nsinputstream ×10
objective-c ×7
ios ×5
nsstream ×4
iphone ×2
afnetworking ×1
bluetooth ×1
c# ×1
cocoa ×1
cocoa-touch ×1
nsdata ×1
nsxmlparser ×1
tcpclient ×1
video ×1
web-services ×1