1

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から入手しました。しかし、「メモリにデータが書き込まれていません!」が記録されます。いつでもエラーは発生せず、相手側でデータが受信されたようには見えません。

4

1 に答える 1

1

高レベルの NSStream メソッドの代わりに低レベルの Core Foundation メソッドを使用することで、これを修正したようです。この記事を出発点として使用しました。

http://oreilly.com/iphone/excerpts/iphone-sdk/network-programming.html

入力ストリームと出力ストリームを非常に長くカバーし、コード例を示します。

お役に立てれば。

于 2012-08-27T21:06:58.433 に答える