NSOutputStream没有正确写入数据
问题描述:
使用NSStreamEventHasSpace可用事件,我试图写一个简单的NSString到一个NSOutputStream。这里是该事件的内容:NSOutputStream没有正确写入数据
uint8_t *readBytes = (uint8_t *)[data mutableBytes];
readBytes += byteIndex; // instance variable to move pointer
int data_len = [data length];
unsigned int len = ((data_len - byteIndex >= 12) ?
12 : (data_len-byteIndex));
uint8_t buf[len];
(void)memcpy(buf, readBytes, len);
len = [output write:(const uint8_t *)buf maxLength:len];
NSLog(@"wrote: %s", buf);
byteIndex += len;
我几乎从苹果公司采取了正确的。数据在我的viewDidLoad方法中初始化为
data = [NSMutableData dataWithData:[@"test message" dataUsingEncoding:NSUTF8StringEncoding]];
[data retain];
HasSpaceAvailable事件被调用两次。在第一个中,整个消息用字母“N”写成。附加到它。第二次,NSLog报告写了一条空白消息(不为空)。然后,发生EndEncountered事件。在这种情况下,我有
NSLog(@"event: end encountered");
assert([stream isEqual:output]);
NSData *newData = [output propertyForKey: NSStreamDataWrittenToMemoryStreamKey];
if (!newData) {
NSLog(@"No data written to memory!");
} else {
NSLog(@"finished writing: %@", newData);
}
[stream close];
[stream removeFromRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[stream release];
output = nil;
break;
我也从苹果得到这个。但是,“没有数据写入内存!”被记录。任何时候都不会发生错误,并且另一端没有收到任何数据。
答
我似乎已经通过使用低级别的Core Foundation方法而不是更高级别的NSStream方法来解决此问题。我用这篇文章作为一个起点:
http://oreilly.com/iphone/excerpts/iphone-sdk/network-programming.html
占地面积很大lenghts输入和输出流,并具有代码示例。
希望这会有所帮助。
UPDATE:即使在我调用[stream write:]之后检查[stream propertyForKey:NSStreamDataWrittenToMemoryStreamKey],它也是(null)。 – Greg 2012-07-30 14:41:47
这一个的任何更新。你最终设法弄清楚了吗? – Andrei 2012-08-26 17:03:01
不是。一点都没有。抱歉。 – Greg 2012-08-26 23:37:43