NSStreamEventHasSpace 利用可能なイベントを使用して、単純な NSString を 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;
私はほとんどAppleからそれを持ってきました。データはviewDidLoadメソッドで初期化されます
data = [NSMutableData dataWithData:[@"test message" dataUsingEncoding:NSUTF8StringEncoding]];
[data retain];
HasSpaceAvailable イベントが 2 回呼び出されます。最初のものでは、メッセージ全体が文字「N」で書かれています。それに追加されます。2 回目に、NSLog は空白のメッセージが書き込まれた (null ではない) ことを報告します。その後、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;
これもAppleから入手しました。しかし、「メモリにデータが書き込まれていません!」が記録されます。いつでもエラーは発生せず、相手側でデータが受信されたようには見えません。